![](https://img-blog.csdnimg.cn/2021031913300073.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指offer
剑指offer
_Charison
这个作者很懒,什么都没留下…
展开
-
剑指offer 03.数组中重复的数字
剑指offer 03.数组中重复的数字题目描述解题思路哈希表注意一个用法,HashSet的add方法,如果要插入的元素产生了重复,则直接返回false。时间:o(n),空间:o(n)class Solution { public int findRepeatNumber(int[] nums) { HashSet<Integer> set = new HashSet<>(); int res = -1; for原创 2021-03-08 16:59:19 · 90 阅读 · 0 评论 -
剑指offer 04. 二维数组中的查找
剑指offer 04. 二维数组中的查找题目描述解题思路从右上角开始遍历,如果当前数大于target,则丢弃当前行;如果当前数小于target,则丢弃当前列;class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix.length == 0 || matrix[0].length == 0) return false;原创 2021-03-10 18:06:40 · 50 阅读 · 0 评论 -
剑指offer 05. 替换空格
剑指offer 05. 替换空格题目描述解题思路利用StringBuilder创建新字符串newStr用于拼接。遍历s,如果当前字符是空格,则在newStr后拼接"%20",否则在newStr后拼接当前字符。class Solution { public String replaceSpace(String s) { if (s == null) return null; StringBuilder newStr = new StringBuilder();原创 2021-03-10 18:06:50 · 50 阅读 · 0 评论 -
剑指offer 06. 从尾到头打印链表
剑指offer 06. 从尾到头打印链表题目描述解题思路利用栈 后进先出 的特性。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public int[] reversePrint(ListNode he原创 2021-03-10 18:06:59 · 50 阅读 · 0 评论 -
剑指offer 07. 重建二叉树
剑指offer 07. 重建二叉树题目描述解题思路细节:在中序遍历中对根节点进行定位时,一种简单的方法是直接扫描整个中序遍历的结果并找出根节点,但这样做的时间复杂度较高。我们可以考虑使用哈希表来帮助我们快速地定位根节点。 对于哈希映射中的每个键值对,键表示一个元素(节点的值),值表示其在中序遍历中的出现位置。在构造二叉树的过程之前,我们可以对中序遍历的列表进行一遍扫描,就可以构造出这个哈希映射。在此后构造二叉树的过程中,我们就只需要 O(1)的时间对根节点进行定位了。/** * Definit原创 2021-03-12 13:06:38 · 69 阅读 · 0 评论 -
剑指offer 08.二叉树的下一个节点
剑指offer 08.二叉树的下一个节点题目描述解题思路/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; }}*/public class Solution {原创 2021-03-11 19:21:47 · 78 阅读 · 0 评论 -
剑指offer 09. 用两个栈实现队列
剑指offer 09. 用两个栈实现队列题目描述解题思路class CQueue { private Stack<Integer> stk1, stk2; public CQueue() { stk1 = new Stack<>(); stk2 = new Stack<>(); } public void appendTail(int value) { stk1.push(原创 2021-03-11 19:32:32 · 68 阅读 · 0 评论 -
剑指offer 10- I. 斐波那契数列
剑指offer 10- I. 斐波那契数列题目描述解题思路注意点:(a + b) % m等价于(a % m + b % m) % m不要混淆:x % n 等价于x &(n - 1)的前提是 n 是2的 n 次方class Solution { public int fib(int n) { if (n <= 1) return n; //base case int dp_0 = 0, dp_1 = 1; int原创 2021-03-11 19:49:11 · 70 阅读 · 0 评论 -
剑指offer 10- II. 青蛙跳台阶问题
剑指offer 10- II. 青蛙跳台阶问题题目描述解题思路此题就是斐波那契数列的变体。class Solution { public int numWays(int n) { if (n == 0 || n == 1) return 1; if (n == 2) return 2; //base case int dp_0 = 1, dp_1 = 2; int res = -1; for原创 2021-03-13 19:07:20 · 73 阅读 · 0 评论 -
剑指offer 11. 旋转数组的最小数字
剑指offer 11. 旋转数组的最小数字题目描述解题思路排序数组的查找问题首先考虑使用 二分法 解决,其可将 遍历法 的 线性级别 时间复杂度降低至 对数级别 。画出折线图分析,注意不要太理想(即全是递增),两边可以搞几个大小相等的点(即非递减)。class Solution { public int minArray(int[] numbers) { int n = numbers.length; int left = 0, right = n -原创 2021-03-13 19:07:27 · 63 阅读 · 0 评论 -
剑指offer 12. 矩阵中的路径
剑指offer 12. 矩阵中的路径题目描述解题思路此题是回溯法,通过 board[row][col] = '#'; 做出选择,并在遍历四个方向后撤销选择,能够防止重复访问当前元素,起到 visited 数组的作用。注意此题和剑指 Offer 13. 机器人的运动范围的区别。那一题为什么仅有 visited[row][col] = true; ,而无需撤销这个选择?因为此题是需要找到一条路径,一个元素可以出现在多条路径上,所以访问完一条路径后,需要回溯清空 visited 数组(即撤销选择),继原创 2021-03-14 09:41:29 · 55 阅读 · 0 评论 -
剑指offer 13. 机器人的运动范围
剑指offer 13. 机器人的运动范围题目描述解题思路注意和剑指 Offer 12. 矩阵中的路径的区别。此题方格中的每个元素在整个过程中仅能访问一次,所以只要访问过某一个元素, visited 就标记为true。class Solution { int res = 0; public int movingCount(int m, int n, int k) { boolean[][] visited = new boolean[m][n]; b原创 2021-03-14 09:41:44 · 69 阅读 · 0 评论 -
剑指offer 14- I. 剪绳子
剑指offer 14- I. 剪绳子题目描述解题思路dp参考题解:动态规划、数学此题是343. 整数拆分的变体,官方题解讲的比较清楚。时间o(n²),空间o(n)class Solution { public int cuttingRope(int n) { //定义:dp[i]表示对于长度为i的绳子,剪成至少两段后可能的最大乘积 int[] dp = new int[n + 1]; //base case dp[1]原创 2021-03-14 15:27:11 · 68 阅读 · 0 评论 -
剑指offer 14- II. 剪绳子 II
剑指offer 14- II. 剪绳子 II题目描述解题思路此题在剪绳子Ⅰ的基础上,多了个取余,因此不能用 Math.pow 方法,需要自己实现求幂。这里使用快速幂,可以当做模板,时间为o(logn),空间为o(1)。主要优化点是用右移运算符代替了除以2,用位与运算符代替了求余来判断一个数是奇数还是偶数。class Solution { private int mod = 1000000007; public int cuttingRope(int n) { i原创 2021-03-14 16:07:04 · 84 阅读 · 0 评论 -
剑指offer 15. 二进制中1的个数
剑指offer 15. 二进制中1的个数题目描述解题思路循环和位移动用掩码检查整数的每一位,并不断将掩码左移。循环的次数等于整数的二进制的位数,32位的整数需要循环32次。public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int bits = 0; //二进制 1 的个数 int mask =原创 2021-03-15 16:10:05 · 74 阅读 · 0 评论 -
剑指offer 16. 数值的整数次方
剑指offer 16. 数值的整数次方题目描述解题思路注意,为什么快速幂的指数用 long 类型?因为int范围是[-2^31,2^31-1],负数的表示范围比正数大,所以不能简单取绝对值。如果底数正好是-2^31,而指数是 int 类型,则会溢出。double 类型的变量比较是否相等,千万不能用“==”,要么转成字符串用 equals 方法,要么像这里一样小于误差。class Solution { public double myPow(double x, int n) {原创 2021-03-15 16:58:08 · 66 阅读 · 0 评论 -
剑指offer 17. 打印从1到最大的n位数
剑指offer 17. 打印从1到最大的n位数题目描述解题思路class Solution { public int[] res; public int indexOfRes = 0; public int[] printNumbers(int n) { res = new int[(int)Math.pow(10, n) - 1]; //保存每一个全排列 char[] num = new char[n]; b原创 2021-03-16 17:14:38 · 66 阅读 · 0 评论 -
剑指offer 18. 删除链表的节点
剑指offer 18. 删除链表的节点题目描述解题思路/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode deleteNode(ListNode head, int val) {原创 2021-03-17 15:43:33 · 59 阅读 · 0 评论 -
剑指offer 19. 正则表达式匹配
剑指offer 19. 正则表达式匹配题目描述解题思路动态规划class Solution { public boolean isMatch(String s, String p) { int sLength = s.length(), pLength = p.length(); //定义:dp[i][j]表示 s[0...i-1] 和 p[0...j-1] 能否匹配 boolean[][] dp = new boolean[sLengt原创 2021-03-17 16:34:49 · 134 阅读 · 0 评论 -
剑指offer 20. 表示数值的字符串
剑指offer 20. 表示数值的字符串题目描述解题思路原创 2021-03-18 21:57:01 · 67 阅读 · 0 评论 -
剑指offer 21. 调整数组顺序使奇数位于偶数前面
剑指offer 21. 调整数组顺序使奇数位于偶数前面题目描述解题思路头尾双指针nums[0...oddIndex] 存奇数,nums[evenIndex...nums.length - 1] 存偶数class Solution { public int[] exchange(int[] nums) { if (nums == null || nums.length == 0) return nums; //双指针,nums[0...oddIndex]存原创 2021-03-19 19:44:22 · 57 阅读 · 0 评论 -
剑指offer 22. 链表中倒数第k个节点
剑指offer 22. 链表中倒数第k个节点题目描述解题思路主要注意鲁棒性问题:k <= 0头指针为空k 比链表长度还要大/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public Li原创 2021-03-19 20:01:22 · 65 阅读 · 0 评论 -
剑指offer 23.链表中环的入口节点
剑指offer 23.链表中环的入口节点题目描述解题思路注意下面这种错误的判断是否有环的写法:while (fast != null && fast.next != null && fast != slow) { fast = fast.next.next; slow = slow.next;}if (fast != slow) return null;说明:当链表中仅有一个节点,且不构成环时,这种写法会出错。所以判断是否有环时,可以改成 if (fas原创 2021-03-20 16:13:45 · 82 阅读 · 0 评论 -
剑指offer 24. 反转链表
剑指offer 24. 反转链表题目描述解题思路注意,这种链表翻转题,一定要自己举个例子把链表画出来,然后模拟翻转的过程。class Solution { //翻转从head开始的链表,并返回翻转后的头结点 public ListNode reverseList(ListNode head) { //base case if (head == null || head.next == null) return head; //新链表原创 2021-03-20 16:49:06 · 53 阅读 · 0 评论 -
剑指offer 25. 合并两个排序的链表
剑指offer 25. 合并两个排序的链表题目描述解题思路class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //用尾插法,将l1和l2插入到虚节点后面 ListNode virtualNode = new ListNode(0); ListNode rear = virtualNode; while (l1 != null &a原创 2021-03-20 18:09:11 · 87 阅读 · 0 评论 -
剑指offer 26. 树的子结构
剑指offer 26. 树的子结构题目描述解题思路class Solution { //判断树 B 是否是树 A 其中某一部分的子结构 public boolean isSubStructure(TreeNode A, TreeNode B) { // base case if (A == null || B == null) return false; //当A、B均不为null时,先序遍历 return isSub(原创 2021-03-21 14:26:41 · 57 阅读 · 0 评论 -
剑指offer 27. 二叉树的镜像
剑指offer 27. 二叉树的镜像题目描述解题思路主要就是交换 root.left 和 root.right ,提前用temp保存其中一个指针就行。class Solution { //将以root为根节点的树镜像翻转,返回翻转后的根节点 public TreeNode mirrorTree(TreeNode root) { //base case if (root == null) return null; TreeNode t原创 2021-03-21 14:36:01 · 59 阅读 · 0 评论 -
剑指offer 28. 对称的二叉树
剑指offer 28. 对称的二叉树题目描述解题思路class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) return true; return isSymmetric(root.left, root.right); } //判断 A 和 B 是否是对称的 public boolean isSymmetric(TreeNode A,原创 2021-03-21 14:51:51 · 57 阅读 · 0 评论 -
剑指offer 29. 顺时针打印矩阵
剑指offer 29. 顺时针打印矩阵题目描述解题思路对于每层,从左上方开始以顺时针的顺序遍历所有元素,遍历完当前层的元素之后,将 left 和 top 分别增加 1,将 right 和 bottom 分别减少 1,进入下一层继续遍历,直到遍历完所有元素为止。注意有个坑!由于循环条件是 while (left <= right && top <= bottom),所以如果当前层仅有一列(left == right)或仅有一行(top == bottom),则只需打印原创 2021-03-22 15:06:31 · 67 阅读 · 0 评论 -
剑指offer 31. 栈的压入、弹出序列
剑指offer 31. 栈的压入、弹出序列题目描述解题思路原创 2021-03-23 13:31:49 · 69 阅读 · 0 评论 -
剑指offer 30.包含min函数的栈
剑指offer 30.包含min函数的栈题目描述解题思路原创 2021-03-23 13:09:15 · 65 阅读 · 1 评论 -
剑指offer 32 - I. 从上到下打印二叉树
剑指offer 32 - I. 从上到下打印二叉树题目描述解题思路层次遍历。注意,ArrayList 转 int[] 数组,需要手动用 for 循环。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */原创 2021-03-23 13:48:47 · 65 阅读 · 0 评论 -
剑指offer 32 - II. 从上到下打印二叉树 II
剑指offer 32 - II. 从上到下打印二叉树 II题目描述解题思路class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<原创 2021-03-23 13:55:32 · 56 阅读 · 0 评论 -
剑指offer 32 - III. 从上到下打印二叉树 III
剑指offer 32 - III. 从上到下打印二叉树 III题目描述解题思路class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new LinkedList<>(); Queue<TreeNode> queue = new LinkedList原创 2021-03-23 14:20:26 · 81 阅读 · 0 评论 -
剑指offer 33. 二叉搜索树的后序遍历序列
剑指offer 33. 二叉搜索树的后序遍历序列题目描述解题思路如果仅知道普通二叉树的后序遍历序列,则无法恢复原来的二叉树,因为无法确定左右子树的下标范围。但这题是二叉搜索树,能够根据特殊性质确定出左右子树的下标范围。class Solution { public boolean verifyPostorder(int[] postorder) { if (postorder.length == 0) return true; return verifyP原创 2021-03-24 16:26:04 · 68 阅读 · 0 评论 -
剑指offer 35. 复杂链表的复制
剑指offer 35. 复杂链表的复制题目描述解题思路原创 2021-03-24 16:29:47 · 73 阅读 · 0 评论 -
剑指offer 34.二叉树中和为某一值的路径
剑指offer 34.二叉树中和为某一值的路径题目描述解题思路class Solution { public List<List<Integer>> res = new LinkedList<>(); public List<List<Integer>> pathSum(TreeNode root, int target) { if (root == null) return res;原创 2021-03-24 18:33:43 · 80 阅读 · 0 评论 -
剑指offer 36. 二叉搜索树与双向链表
剑指offer 36. 二叉搜索树与双向链表题目描述解题思路二叉搜索树的中序遍历就是顺序链表。本题还用到了中序遍历记录前驱的方法。class Solution { Node head, pre; public Node treeToDoublyList(Node root) { if (root == null) return null; //将树转化为双向链表,pre最后停留在尾节点上 inorderTraversal(root原创 2021-03-25 10:58:02 · 63 阅读 · 0 评论 -
剑指offer 38. 字符串的排列
剑指offer 38. 字符串的排列题目描述解题思路由于 res 中有可能会出现重复的全排列,如 aab 的全排列会出现重复,所以 res 需要用 HashSet 来去重。如果遇上字符串的回溯,且需要实现 contains 的功能(即防止重复访问字符),则可以用 visited 数组来标记访问。将字符串数组 ArrayList(或 LinkedList、HashSet 等)转化为 String 数组的方法:ArrayList<String> src = new Arra原创 2021-03-25 19:55:24 · 80 阅读 · 0 评论 -
剑指offer 37. 序列化二叉树
剑指offer 37. 序列化二叉树题目描述解题思路前序遍历public class Codec { String SEP = ","; //分割符 String NULL = "#"; //空指针 // Encodes a tree to a single string. //定义:将以root为根节点的二叉树序列化为 "2,#,#,"的形式 public String serialize(TreeNode root) {原创 2021-03-26 20:13:10 · 61 阅读 · 0 评论