剑指Offer
lankerens
日常抄代码并给大佬点赞
展开
-
剑指 Offer 51. 数组中的逆序对 ( 归并 )
LeetCode:剑指 Offer 51. 数组中的逆序对归并排序老规矩三部曲分逻辑处理并(排序)第一次逻辑处理的时候, 就已经并过一次排序了AC Codeclass Solution { public int reversePairs(int[] nums) { // int len = nums.length; if(len < 2) return 0; int ans = devide(num原创 2021-01-21 02:45:19 · 90 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
LeetCode: 剑指 Offer 25. 合并两个排序的链表遍历两条链表,比较两条之间谁的值更小,那么当前节点 node 的 next 就指向 更小的那个节点, 为了方便根据值直接new ListNode(int val)了。直到其中一条/或两条都遍历完了, 如果还有没遍历完的,直接将 node 的 next 指向没遍历完的即可AC代码 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListN原创 2020-10-28 15:45:43 · 67 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
LeetCode: 剑指 Offer 28. 对称的二叉树检验是否对称二叉树 >> 递归 >> 为什么要递归 >> 递归条件对称二叉树的定义:对一个节点的 L 节点 和 R 节点, 一定有:L.val == R.valL.left.val == R.right.valL.right.val = R.left.val根据以上的规律,从上递归到下,判断每个节点是否对称 >> 判断是否为对称二叉树递归法 public原创 2020-10-26 20:18:13 · 146 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
LeetCode: 剑指 Offer 22. 链表中倒数第k个节点快慢双指针快慢指针 public ListNode getKthFromEnd(ListNode head, int k) { if(head == null) return null; ListNode slow = head, fast = head; for (int i = 0; i < k - 1; i++) { if(fast.ne原创 2020-10-26 18:42:46 · 44 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
LeetCode: 剑指 Offer 42. 连续子数组的最大和思路:DP代码 public int maxSubArray(int[] nums) { int[] dp = new int[nums.length]; dp[0] = nums[0]; int ans = nums[0]; for (int i = 1; i < nums.length; i++) { if(dp[i - 1]原创 2020-10-24 22:18:47 · 90 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
LeetCode: 剑指 Offer 57 - II. 和为s的连续正数序列双指针 >> 滑动窗口维护一个连续的整数序列定义所需要的变量 >> sum >> left >> right双指针 >> 滑动窗口 public int[][] findContinuousSequence(int target) { if(target < 3) return new int[][]{{tar原创 2020-10-24 20:46:45 · 64 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
LeetCode: 剑指 Offer 07. 重建二叉树前序: 根左右 >> 第一个就是根结点pre_left (后面的左子树部分区间变为pre_left + 1. ----- pre_left + ( k - il ))中序: 左根有 >> 根据根节点(index == k),找出其左子树有.k - il 个, 以分区左右子树的区间朴素递归拆分左右子树 // map 用来记录中序遍历中各个val在数组中的位置 Map<In原创 2020-10-23 17:41:05 · 124 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II
LeetCode: 剑指 Offer 32 - II. 从上到下打印二叉树 II树的层序遍历. >> bfs List<Integer> list = new ArrayList<>(); List<List<Integer>> ans = new ArrayList<>(); public List<List<Integer>> levelOrder(TreeNode原创 2020-10-23 16:53:01 · 58 阅读 · 0 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树
LeetCode: 剑指 Offer 32 - I. 从上到下打印二叉树树的中序遍历 >> bfs public int[] levelOrder(TreeNode root) { /** * 层序遍历 */ if(root == null) return new int[0]; List<Integer> list = new ArrayList<>()原创 2020-10-23 16:43:14 · 56 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
LeetCode: 剑指 Offer 39. 数组中出现次数超过一半的数字当该数出现的次数大于数组长度的一半时, 排序后, 数组中间的数一定为该数哈希表摩尔投票法 >> 最佳解法3.1 通过假设众数 >> 相等票数++, 不等票数–, 当票数 == 0 重新假设众数出现的次数超过数组长度的一半,排序后该数在数组的中间一定存在 public int majorityElement(int[] nums) { Arrays.sort(原创 2020-10-22 23:12:09 · 76 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
LeetCode: 剑指 Offer 34. 二叉树中和为某一值的路径递归回溯递归回溯注意// 防止同一个叶子节点计算两次if(node.left != null || node.right != null) List<Integer> list = new ArrayList<>(); List<List<Integer>> ans = new ArrayList<>(); public List&原创 2020-10-22 22:40:03 · 130 阅读 · 0 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 II
LeetCode: 剑指 Offer 56 - II. 数组中数字出现的次数 II有限状态自动机遍历统计 ( 模板 )位运算遍历统计位运算 >> 重点代码 public int singleNumber(int[] nums) { int[] counts = new int[32]; for (int i = 0; i < nums.length; i++) { for (int j =原创 2020-10-20 23:03:14 · 87 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树
LeetCode: 剑指 Offer 37. 序列化二叉树序列化 >> 树的层序遍历反序列化 >> 将各个节点存入到 List 中然后通过 list 的遍历, 双指针 >> slow 记录当前父节点 >> fast 记录当前遍历到的子节点 // 序列化 树 // Encodes a tree to a single string. public String serialize(TreeNode root)原创 2020-10-20 21:14:24 · 85 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
LeetCode: 剑指 Offer 24. 反转链表双指针递归 >> 也可以用 Stack双指针 public ListNode reverseList(ListNode head) { if(head == null || head.next == null) return head; ListNode slow = head, fast = head.next; slow.next = null;原创 2020-10-20 20:22:15 · 51 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
LeetCode: 剑指 Offer 46. 把数字翻译成字符串递归回溯1.1 先是 +1 遍历每一位数1.2 之后从后往前 +2 的形式拼接成两位数动态规划 >> 没想到递归回溯想到了递归回溯,但不知道怎么下手, 确实没有想到这样的写法。 int ans = 0; public int translateNum(int num) { String s = String.valueOf(num); dfs(s,原创 2020-10-20 19:50:05 · 107 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
LeetCode: 剑指 Offer 57. 和为s的两个数字哈希表 >> hash >> 对无序的数组可能好一点 >> 但是这个是有序的数组有更优解递归回溯 >> 时间、空间复杂度都挺高的感觉,和 哈希表差不多吧,O(n) ?二分 >> 时间复杂度 O(Nlogn) 空间复杂度 O(1)双指针 >> 时间复杂度 O(N) 空间复杂度 O(1) >> 最优解原创 2020-10-18 17:03:02 · 70 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
LeetCode: 剑指 Offer 17. 打印从1到最大的n位数easy 题 public int[] printNumbers(int n) { int jishu = 9; int mx = 9; for (int i = 1; i < n; i++) { int temp = mx * 10; mx = temp + jishu; } int[]原创 2020-10-18 16:04:24 · 58 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串 -- DP解法
LeetCode: 剑指 Offer 48. 最长不含重复字符的子字符串与 滑动窗口 类似 >> 间接维护了一个不重复的元素的范围的最左边的位置DP >> 转移方程 >> 对上一个区间长度 与 当前区间长度 去 min最终结果 >> 通过一个 ans 变量记录状态定义: dp[j] 表示右边界下标为 j 的时候,可以取到的最长不重复范围长度。转移方程:j - i 为一个区间 (当前下标 - 上一个重复元素的下标)dp[j原创 2020-10-17 19:53:54 · 257 阅读 · 1 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
LeetCode: 剑指 Offer 48. 最长不含重复字符的子字符串根据题目提示: 哈希表、双指针滑动窗口定义需要用到的变量: map 、fast 快指针、slow 慢指针slow 记录滑动窗口的起始 (即重复元素的下标 index + 1 的位置)fast 遍历整个 string, 遇到重复的元素停下 >> 进行slow、mx 、map 更新等滑动窗口维护一个元素不重复的窗口 public int lengthOfLongestSubst原创 2020-10-17 17:15:07 · 120 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
LeetCode: 剑指 Offer 45. 把数组排成最小的数思路稍微对了一点,但是没有想到自定义排序自定义排序 Arrays.sort(T[], Comparator<? super T> c)自定义排序 public String minNumber(int[] nums) { String ans = ""; String[] arr = new String[nums.length]; for (i原创 2020-10-17 15:34:55 · 127 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数
LeetCode: 剑指 Offer 56 - I. 数组中数字出现的次数哈希表 >> 时间复杂度 + 空间复杂度 偏高 >> 效率有点低分组异或哈希表 public int[] singleNumbers(int[] nums) { List<Integer> list = new ArrayList<>(); Map<Integer, Integer> map = ne原创 2020-10-16 23:06:49 · 77 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
LeetCode: 剑指 Offer 15. 二进制中1的个数输入一个整数 >> 计算出其二进制下的 1 的个数Java 竟然有自带的静态函数 bitCountbitCount 源码逐位比较Java Integer 自带 bitCount public int hammingWeight(int n) { return Integer.bitCount(n); }逐位比较 public int hammin原创 2020-10-16 22:25:43 · 110 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
LeetCode: 剑指 Offer 53 - II. 0~n-1中缺失的数字还是排好序的,必然想到 二分查找找左边界根据下标值和下标不一致,就继续查找,right = mid - 1如果值和下标一致,left = mid + 1class Solution { public int missingNumber(int[] nums) { int left = 0, right = nums.length - 1; // 找左边界原创 2020-10-14 21:42:02 · 100 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
LeetCode: 剑指 Offer 58 - I. 翻转单词顺序分割字符串 public String reverseWords(String s) { String ans = ""; String[] split = s.split(" "); for (int i = split.length - 1; i >= 0; i--) { if(split[i].equals("")) continue ;原创 2020-10-14 21:11:30 · 56 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
LeetCode: 剑指 Offer 53 - I. 在排序数组中查找数字 I这样写不会数据溢出int mid = left + (right - left) / 2;class Solution { public int search(int[] nums, int target) { if(nums == null || nums.length == 0) return 0; int index = binSearch(nums, target原创 2020-10-13 21:51:02 · 73 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值
LeetCode: 剑指 Offer 59 - I. 滑动窗口的最大值滑动窗口 >> 队列class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums == null || nums.length == 0) return new int[0]; List<Integer> ans = new ArrayList<>();原创 2020-10-13 20:33:10 · 57 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
LeetCode: 剑指 Offer 52. 两个链表的第一个公共节点浪漫相遇public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode ahead = headA, bhead = headB; while(ahead != bhead){ if(ahead == nu原创 2020-10-10 22:32:05 · 63 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
LeetCode: 剑指 Offer 54. 二叉搜索树的第k大节点二叉搜索树中序遍历 >> 遍历出来的结果是从小到大将中序遍历(左 根 右)翻转 >> (右 根 左) >> 从大到小遍历 >> 当 cnt 计数到 k 时,输出当前节点 就是 ans int cnt, ans; public int kthLargest(TreeNode root, int k) { if(root.right !=原创 2020-10-10 21:16:44 · 52 阅读 · 0 评论 -
剑指 Offer 49. 丑数
LeetCode: 剑指 Offer 49. 丑数丑数的递推性质: 丑数只包含因子 2, 3, 52,3,5 ,因此有 “丑数 == 某较小丑数 \times× 某因子” (例如:10 = 5×2)class Solution { public int nthUglyNumber(int n) { int[] map = new int[n + 1]; map[1] = 1; int a = 1, b = 1, c = 1;原创 2020-10-09 22:16:00 · 73 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
LeetCode: 剑指 Offer 66. 构建乘积数组双重循环 >> 超时解决 >>1.从左到右累乘2.从右到左累乘class Solution { public int[] constructArr(int[] a) { int len = a.length ; int[] ans = new int[len]; int temp = 1; // 从左到右 for原创 2020-10-09 20:50:51 · 54 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
LeetCode: 剑指 Offer 65. 不用加减乘除做加法主要考察位运算进行模拟加法需要位运算一定的积累class Solution { public int add(int a, int b) { int ans = (a ^ b) ^ (a & b) << 1; int c = (a ^ b); int d = (a & b) << 1; if((c & d)原创 2020-10-08 17:44:27 · 116 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
LeetCode: 剑指 Offer 11. 旋转数组的最小数字本来直接 Arrays.sort(arr) sout>>arr[0] 即可了但是这题主要是想让我们来充分利用已有的部分有序来找到最小值二分 + 去重直接排序输出遍历 >> 降序即为最小二分代码去重的时候,不知道重复的是左部分还是右部分,需要 right--class Solution { public int minArray(int[] numbers) {原创 2020-10-08 17:07:42 · 49 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
LeetCode: 剑指 Offer 61. 扑克牌中的顺子需要考虑的情况有点多,不是思维上的难情况种类大概0,0,2,2,54,2,9,7,60,0,1,2,5情况列举法class Solution { public boolean isStraight(int[] nums) { // 从小到大排序 Arrays.sort(nums); // 记录 0 的个数 int zero = 0; fo原创 2020-10-07 20:20:50 · 54 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
LeetCode: 剑指 Offer 55 - II. 平衡二叉树类似 计算树的深度层序遍历 √注意这种情况,所以同时需要递归子节点进行左右子树高度的判断后序遍历法class Solution { public boolean isBalanced(TreeNode root) { if(root == null) return true; return lankeren(root) != -1; } public原创 2020-10-07 18:44:40 · 71 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字
LeetCode: 剑指 Offer 62. 圆圈中最后剩下的数字约瑟夫环问题模拟法数学法模拟代码 public int lastRemaining(int n, int m) { List<Integer> list = new ArrayList<>(n); // 初始化 for (int i = 0; i < n; i++) { list.add(i);原创 2020-10-06 19:48:45 · 109 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
LeetCode: 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先三种情况p、q 分别在节点的左子树、右子树p 、q 都在节点的左子树 (该节点的可能性包括自身 p | q)p、 q 都在节点的右子树 (该节点的可能性包括自身 p | q)当我们往下遍历当同时找到两个 left 、right 都不为 null,表示当前就是最近父节点当只找到其中一个,直接返回,因为它就是父节点,因为另一个必定在它的左或者右子树class Solution { public原创 2020-10-05 19:18:25 · 160 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
LeetCode: 剑指 Offer 50. 第一个只出现一次的字符使用哈希表的顺序存储结构 LinkedHashMap不过解出来的效率比较低class Solution { public char firstUniqChar(String s) { char ans = ' '; Map<Character, Integer> map = new LinkedHashMap<>(); for (int i原创 2020-10-05 18:06:40 · 67 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
LeetCode:剑指 Offer 27. 二叉树的镜像树的遍历将左右子树交换即可class Solution { // 树的遍历 public TreeNode mirrorTree(TreeNode root) { if(root == null) return null; TreeNode right = root.left; root.left = root.right; root.right = ri原创 2020-10-05 17:16:02 · 54 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
LeetCode: 剑指 Offer 47. 礼物的最大价值入门级 dp 题1 找状态2 转移方程3 初始状态4 返回值dp[i][j] = grid[i][j] + Math.max(dp[i - 1][j], dp[i][j - 1]) public int maxValue(int[][] grid) { int r = grid.length; int c = grid[0].length; int[][] dp = ne原创 2020-10-04 15:37:47 · 73 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
LeetCode: 剑指 Offer 55 - I. 二叉树的深度计算树的深度 >> 层序遍历( bfs )树其他的遍历方式 >> dfs层序遍历代码 public int maxDepth(TreeNode root) { if(root == null) return 0; // 队列 Queue<TreeNode> queue = new LinkedList<>();原创 2020-10-03 17:34:02 · 84 阅读 · 0 评论