《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_3

《剑指Offer》笔记&题解&思路&技巧&优化_Part_3

  • 😍😍😍 相知
  • 🙌🙌🙌 相识
  • 😢😢😢 开始刷题
    • 1. LCR 138. 有效数字——表示数值的字符串
    • 2. LCR 139. 训练计划 I——调整数组顺序使奇数位于偶数前面
    • 3. LCR 140. 训练计划 II——链表中倒数第k个节点
    • 4. LCR 141. 训练计划 III——反转链表
    • 5. LCR 142. 训练计划 IV——合并两个排序的链表
    • 6. LCR 143. 子结构判断——树的子结构
    • 7. LCR 144. 翻转二叉树——二叉树的镜像
    • 8. LCR 145. 判断对称二叉树——对称的二叉树
    • 9. LCR 146. 螺旋遍历二维数组——顺时针打印矩阵
    • 10. LCR 147. 最小栈——包含min函数的栈

在这里插入图片描述

😍😍😍 相知

当你踏入计算机科学的大门,或许会感到一片新奇而陌生的领域,尤其是对于那些非科班出身的学子而言。作为一位非科班研二学生,我深知学习的道路可能会充满挑战,让我们愿意迎接这段充满可能性的旅程。

最近,我开始了学习《剑指Offer》和Java编程的探索之旅。这不仅是一次对计算机科学的深入了解,更是对自己学术生涯的一次扩展。或许,这一切刚刚开始,但我深信,通过努力与坚持,我能够逐渐驾驭这门技艺。

在这个博客中,我将深入剖析《剑指Offer》中的问题,并结合Java编程语言进行解析。

让我们一起踏上这段学习之旅,共同奋斗,共同成长。无论你是已经驾轻就熟的Java高手,还是像我一样初出茅庐的学子,我们都能在这里找到彼此的支持与激励。让我们携手前行,共同迎接知识的挑战,为自己的未来打下坚实的基石。

这是我上一篇博客的,也希望大家多多关注!

  1. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_1
  2. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_2

🙌🙌🙌 相识

根据题型可将其分为这样几种类型:

  1. 结构概念类(数组,链表,栈,堆,队列,树)
  2. 搜索遍历类(深度优先搜索,广度优先搜索,二分遍历)
  3. 双指针定位类(快慢指针,指针碰撞,滑动窗口)
  4. 排序类(快速排序,归并排序)
  5. 数学推理类(动态规划,数学)

😢😢😢 开始刷题

1. LCR 138. 有效数字——表示数值的字符串

题目跳转:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/description/

边界条件很多

学会函数:

  1. s = s.trim();
  2. char[] res = s.toCharArray();
class Solution {public boolean isNumber(String s) {if (s == null || s.length() == 0) return false;//去掉首尾空格s = s.trim();boolean numFlag = false;boolean dotFlag = false;boolean eFlag = false;for (int i = 0; i < s.length(); i++) {//判定为数字,则标记numFlagif (s.charAt(i) >= '0' && s.charAt(i) <= '9') {numFlag = true;//判定为.  需要没出现过.并且没出现过e} else if (s.charAt(i) == '.' && !dotFlag && !eFlag) {dotFlag = true;//判定为e,需要没出现过e,并且出过数字了} else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eFlag && numFlag) {eFlag = true;numFlag = false;//为了避免123e这种请求,出现e之后就标志为false//判定为+-符号,只能出现在第一位或者紧接e后面} else if ((s.charAt(i) == '+' || s.charAt(i) == '-') && (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) {//其他情况,都是非法的} else {return false;}}return numFlag;}
}

2. LCR 139. 训练计划 I——调整数组顺序使奇数位于偶数前面

题目跳转:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/description/

class Solution {public int[] trainingPlan(int[] actions) {if(actions==null)return null;if(actions.length==0)return new int[0];int slow = 0;int fast = 0;while(fast<actions.length&&slow<actions.length){if(actions[slow]%2==0){while(fast<actions.length){if(actions[fast]%2==1){int temp = actions[fast];for(int i = fast;i>slow;i--){actions[i] = actions[i-1];}actions[slow] =temp;break;}else fast++;}}slow++;fast++;}return actions;}
}

在这里插入图片描述

class Solution {public int[] trainingPlan(int[] nums) {if(nums == null || nums.length == 0){return nums;}int left = 0;int right = nums.length - 1;while(left < right){while(left < right && nums[left] % 2 != 0) left++;while(left < right && nums[right] % 2 != 1) right--;int temp = nums[left];nums[left] = nums[right];nums[right] = temp;}return nums;}
}

3. LCR 140. 训练计划 II——链表中倒数第k个节点

题目跳转:https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/description/

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode trainingPlan(ListNode head, int cnt) {if(head==null) return null;if(head.next == null) return head;ListNode result = head;int num = 0;while(result!=null){num++;result = result.next;}num = num - cnt;while(num!=0){head = head.next;num--;}return head;}
}

来个牛逼的

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode trainingPlan(ListNode head, int cnt) {if(head==null) return null;if(head.next == null) return head;ListNode slow = head;ListNode fast = head;for(int i = 0;i<cnt;i++){if(fast==null)return null;fast = fast.next;}while(fast!=null){slow = slow.next;fast = fast.next;}return slow;}
}

4. LCR 141. 训练计划 III——反转链表

题目跳转:https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/description/

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode trainningPlan(ListNode head) {ListNode result = new ListNode(0);while(head!=null){ListNode temp = head;head = head.next;temp.next= result.next;result.next = temp;}return result.next;}
}

递归
在这里插入图片描述

class Solution {public ListNode trainningPlan(ListNode head) {if(head==null||head.next==null)return head;ListNode temp = trainningPlan(head.next);head.next.next = head;head.next= null;return temp;}
}

5. LCR 142. 训练计划 IV——合并两个排序的链表

题目跳转:https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/description/

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode trainningPlan(ListNode l1, ListNode l2) {if(l1==null)return l2;if(l2==null)return l1;ListNode result = new ListNode();ListNode temp = result;while(l1!=null||l2!=null){if(l1!=null&&l2!=null){if(l1.val<l2.val){ListNode res = new ListNode(l1.val);temp.next= res;temp =temp.next;l1 = l1.next;}else{ListNode res = new ListNode(l2.val);temp.next= res;temp =temp.next;l2 = l2.next;}}if(l1==null){temp.next =l2;break; }if(l2==null){temp.next =l1;break; }}return result.next;}
}

递归思路
我们可以如下递归地定义两个链表里的 merge 操作(忽略边界情况,比如空链表等):

{ l i s t 1 [ 0 ] + m e r g e ( l i s t 1 [ 1 : ] , l i s t 2 ) l i s t 1 [ 0 ] < l i s t 2 [ 0 ] l i s t 2 [ 0 ] + m e r g e ( l i s t 1 , l i s t 2 [ 1 : ] ) o t h e r w i s e \left\{ \begin{array}{ll} list1[0] + merge(list1[1:], list2) & list1[0] < list2[0] \\ list2[0] + merge(list1, list2[1:]) & otherwise \end{array} \right. {list1[0]+merge(list1[1:],list2)list2[0]+merge(list1,list2[1:])list1[0]<list2[0]otherwise

也就是说,两个链表头部值较小的一个节点与剩下元素的 merge 操作结果合并。

算法

我们直接将以上递归过程建模,同时需要考虑边界情况。

如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。

class Solution {public ListNode trainningPlan(ListNode l1, ListNode l2) {if (l1 == null) {return l2;} else if (l2 == null) {return l1;} else if (l1.val < l2.val) {l1.next = trainningPlan(l1.next, l2);return l1;} else {l2.next = trainningPlan(l1, l2.next);return l2;}}
}

6. LCR 143. 子结构判断——树的子结构

题目跳转:https://leetcode.cn/problems/shu-de-zi-jie-gou-lcof/description/

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public boolean isSubStructure(TreeNode A, TreeNode B) {if(A==null||B==null)return false;if(isSub(A,B))return true;if(isSubStructure(A.left, B) || isSubStructure(A.right, B)){return true;}return false;}public boolean isSub(TreeNode TA,TreeNode TB){if(TB==null)return true;if(TA==null)return false;if(TA.val!=TB.val)return false;return isSub(TA.left,TB.left)&&isSub(TA.right,TB.right);}
}

7. LCR 144. 翻转二叉树——二叉树的镜像

题目跳转:https://leetcode.cn/problems/er-cha-shu-de-jing-xiang-lcof/description/

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode mirrorTree(TreeNode root) {if(root==null)return root;if(root.right==null&&root.left==null)return root;TreeNode temp = root.left;root.left = root.right;root.right = temp;root.right = mirrorTree(root.right);root.left = mirrorTree(root.left);return root;}}

8. LCR 145. 判断对称二叉树——对称的二叉树

题目跳转:https://leetcode.cn/problems/dui-cheng-de-er-cha-shu-lcof/description/

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean checkSymmetricTree(TreeNode root) {if(root==null)return true;if(root.left==null&&root.right==null)return true;if(root.right==null||root.left==null)return false;return check(root.left,root.right);}public boolean check(TreeNode A,TreeNode B){if(A==null&&B==null)return true;if(A==null||B==null)return false;if(A.val!=B.val)return false;return check(A.left,B.right)&&check(A.right,B.left);}
}

9. LCR 146. 螺旋遍历二维数组——顺时针打印矩阵

题目跳转:https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/description/

在这里插入图片描述
算法流程

  • 空值处理: 当 array 为空时,直接返回空列表 [] 即可。
  • 初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。
  • 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印;
    • 根据边界打印,即将元素按顺序添加至列表 res 尾部;
    • 边界向内收缩 1 (代表已被打印);
    • 判断边界是否相遇(是否打印完毕),若打印完毕则跳出。
  • 返回值: 返回 res 即可。
打印方向1. 根据边界打印2. 边界向内收缩3. 是否打印完毕
从左向右左边界l ,右边界 r上边界 t 加 111是否 t > b
从上向下上边界 t ,下边界b右边界 r 减 111是否 l > r
从右向左右边界 r ,左边界l下边界 b 减 111是否 t > b
从下向上下边界 b ,上边界t左边界 l 加 111是否 l > r
class Solution {public int[] spiralArray(int[][] array) {if(array.length == 0) return new int[0];int l = 0, r = array[0].length - 1, t = 0, b = array.length - 1, x = 0;int[] res = new int[(r + 1) * (b + 1)];while(true) {for(int i = l; i <= r; i++) res[x++] = array[t][i]; // left to rightif(++t > b) break;for(int i = t; i <= b; i++) res[x++] = array[i][r]; // top to bottomif(l > --r) break;for(int i = r; i >= l; i--) res[x++] = array[b][i]; // right to leftif(t > --b) break;for(int i = b; i >= t; i--) res[x++] = array[i][l]; // bottom to topif(++l > r) break;}return res;}
}

按层模拟:
在这里插入图片描述

class Solution {public int[] spiralArray(int[][] array) {if (array == null || array.length == 0 || array[0].length == 0) {return new int[0];}int rows = array.length, columns = array[0].length;int[] order = new int[rows * columns];int index = 0;int left = 0, right = columns - 1, top = 0, bottom = rows - 1;while (left <= right && top <= bottom) {for (int column = left; column <= right; column++) {order[index++] = array[top][column];}for (int row = top + 1; row <= bottom; row++) {order[index++] = array[row][right];}if (left < right && top < bottom) {for (int column = right - 1; column > left; column--) {order[index++] = array[bottom][column];}for (int row = bottom; row > top; row--) {order[index++] = array[row][left];}}left++;right--;top++;bottom--;}return order;}
}

复杂度分析

  • 时间复杂度:O(mn),其中 m 和 n 分别是输入二维数组的行数和列数。二维数组中的每个元素都要被访问一次。

  • 空间复杂度:O(1)。除了输出数组以外,空间复杂度是常数。


10. LCR 147. 最小栈——包含min函数的栈

题目跳转:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/description/

class MinStack {/** initialize your data structure here. */int minstack = Integer.MAX_VALUE;;Stack<Integer> stack;public MinStack() {stack = new Stack<Integer>();}public void push(int x) {stack.push(minstack);minstack = x<minstack?x:minstack;stack.push(x);}public void pop() {stack.pop();minstack = stack.pop();}public int top() {return stack.peek();}public int getMin() {return minstack;}
}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(x);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.getMin();*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB导出图程序

本文将以代码的形式快速介绍MATLAB导出图到Paper 1 从simulation导出数 2 与simulation同源文件夹下创建导图m文件 代码如下&#xff1a; % 实验后的数据处理用 M-文件 % clear all % 清空工作空间 % close all      % 关闭所有图形窗口 % load adp.mat …

算法中关于数学的题目练习

算法中关于数学的题目练习 1、买不到的数目题目信息思路题解 2、蚂蚁感冒题目信息思路题解 3、饮料换购题目信息思路题解 1、买不到的数目 题目信息 思路 数学结论&#xff08;证明略&#xff09;&#xff1a; p、q为正整数且互质&#xff0c;不能由p、q凑出来的最大的数为(p…

java生态环境评价Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 生态环境评价管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

RK3399平台开发系列讲解(USB篇)USB控制传输方式介绍

🚀返回专栏总目录 文章目录 一、控制传输详解二、Setup阶段和Data阶段三、Setup 事务格式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢USB控制传输是USB通信中的一种基本传输类型,用于控制USB设备的配置和操作。它由 Setup 阶段和 Data 阶段组成,可用于发送命令…

SIFT 2D/3D检测原理

一、SIFT 2D 二、SIFT 3D SIFT 3D关键点检测以及SAC-IA粗配准-CSDN博客

轻资产上班族副业,steam搬砖项目新手1周出结果

作为一个80后社畜&#xff0c;我打从上大学就喜欢倒腾各种赚钱的事情&#xff0c;不管操作网络上还是现实中的任何项目我都会亲自去摸索其中的赚钱原理&#xff0c;实践才能出真知。steam搬砖项目是我实操了3年多的项目&#xff0c;这个steam搬砖项目长期稳定又老牌阳光&#x…

深入理解lambda表达式

深入理解ASP.NET Core中的中间件和Lambda表达式 var builder WebApplication.CreateBuilder(args); var app builder.Build(); app.Use(async (context, next) > { // Add code before request. await next(context);// Add code after request.}); 这段C#代码是用于设…

模型 IPO(输入、处理、输出)学习模型

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。重在提升认知。信息转化与传递。 1 模型 IPO(输入、处理、输出)学习模型的应用 1.1 项目管理知识体系 PMBOK 中的IPO应用 在项目管理领域&#xff0c;PMBOK&#xff08;Project Management Body of Know…

防火墙 iptables(二)--------------------SNAT与DNAT

一、SNAT ①SNAT 应用环境: 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) ②SNAT原理: 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由…

下一代模型:Gemini 1.5,正如它的名字一样闪亮登场

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

QObject 的拷贝构造和赋值操作

QObject中没有提供一个拷贝构造函数和赋值操作符给外界使用&#xff0c;其实拷贝构造和赋值的操作都是已经声明了的&#xff0c;但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域。因此所有继承自QObject的类都使用这个宏声明了他们的拷贝构造函数和赋值操作符为私有。 …

Java集合篇之深入解析LinkedList

写在开头 作为ArrayList的同门师兄弟&#xff0c;LinkedList的师门地位逊色不少&#xff0c;除了在做算法题的时候我们会用到它之外&#xff0c;在实际的开发工作中我们极少使用它&#xff0c;就连它的创造者都说&#xff1a;“I wrote it&#xff0c;and I never use it”&am…

[java基础揉碎]二维数组

目录 什么是二维数组&#xff1a; 二维数组在内存中的布局: 动态初始化: 静态初始化: 杨辉三角: 使用细节和注意事项: 什么是二维数组&#xff1a; 1.从定义形式上看 int[][] 2.可以这样理解&#xff0c;原来的一维数组的每个元素是一维数组&#xff0c;就构成二维数…

OpenCV识别人脸案例实战

使用级联函数 基本流程 函数介绍 在OpenCV中&#xff0c;人脸检测使用的是cv2.CascadeClassifier.detectMultiScale()函数&#xff0c;它可以检测出图片中所有的人脸。该函数由分类器对象调用&#xff0c;其语法格式为&#xff1a; objects cv2.CascadeClassifier.detectMul…

问题:由于环境因素或人为因素干扰,致使土地生态系统的结构和功能失调,引起() #学习方法#经验分享

问题&#xff1a;由于环境因素或人为因素干扰&#xff0c;致使土地生态系统的结构和功能失调&#xff0c;引起&#xff08;) A&#xff0e;土地退化 B&#xff0e;土壤污染 C&#xff0e;生态平衡失调 D&#xff0e;土地沙化 参考答案如图所示

JavaSE-03笔记【继承~super】

文章目录 1. 继承1.1 继承概述&#xff08;理解&#xff09;1.2 如何继承&#xff08;掌握&#xff09;1.2.1 继承的语法格式1.2.2 具体举例 1.3 继承的相关特性&#xff08;掌握&#xff09;1.4 对继承自Object类的方法的测试&#xff08;理解&#xff09;1.5 难点解惑1.5.1 掌…

leetcode hot 100最小花费爬楼梯

本题和之前的爬楼梯类似&#xff0c;但是需要考虑到花费的问题&#xff01;**注意&#xff0c;只有在爬的时候&#xff0c;才花费体力&#xff01;**那么&#xff0c;我们还是按照动态规划的五部曲来思考。 首先我们要确定dp数组的含义&#xff0c;那么就是我们爬到第i层所花费…

代码随想录 Leetcode134. 加油站

题目&#xff1a; 代码(首刷看解析 2024年2月15日&#xff09;&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum 0;int sum 0;int startIndex 0;for (int i 0; i < gas.size(); i)…

SCI文章复现 | GEO文章套路,数据下载和批次效应处理

原文链接&#xff1a; SCI文章复现 | GEO文章套路&#xff0c;数据下载和批次效应处理https://mp.weixin.qq.com/s/KBA67EJ7cCK5NDTUzrwJ2Q 一、前言 这是2024年春节后的第一个推送教程&#xff0c;我们也给大家赠送一个福利。将前期的付费教程免费推送给大家。其实&#xff…

【头歌·计组·自己动手画CPU】四、控制器设计(理论版) 【计算机硬件系统设计】

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎 ❤️关注 &#x1f44d;点赞 &#x1f64c;收藏 ✍️留言 文章目录 一、课程设计目的二、课程设计内容三、课程设计步骤四、课程设计总结 一、课程设计目的 掌握 CPU …