![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
文章平均质量分 77
奔跑的废柴
卧久者行必远,伏久者飞必高
展开
-
【目录】LeetCode《剑指Offer》java题解分类汇总
1.链表1.剑指Offer06从头到尾打印链表java题解2.剑指 Offer 18. 删除链表的节点java题解3.剑指 Offer 22. 链表中倒数第k个节点java题解4.剑指 Offer 24. 反转链表Java题解5.剑指 Offer 25. 合并两个排序的链表Java题解6.剑指 Offer 35. 复杂链表的复制java题解7.剑指 Offer 36. 二叉搜索树与双向链表java题解8.剑指 Offer 52. 两个链表的第一个公共节点java题解2.树1.剑指 Off原创 2020-10-25 13:22:07 · 972 阅读 · 2 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先java题解
上一题,二叉搜索树的最近公共祖先,由于二叉搜索树是有序的,而二叉树是无序的,所以解法会不同。1.分析后序遍历(左、右、根)dfs最近公共祖先有三种情况:1.p,q分别在root的左右子树中2.p=root,且 q在 root的左或右子树中;3.q = root,且 p 在 root 的左或右子树中;递归终止条件:1.root为空,返回null2.root=p或root=q,返回root递归左子树root.left,递归右子树root.right。递归结果:1.如果递归左右子树都为空原创 2020-10-24 13:06:59 · 208 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先java题解
日记:靓仔800及格了1.迭代法1.1 分析root为最近公共祖先,有三种情况:1.p,q分别在root的左右子树中2.p,q都在root的左子树中3.p,q都在root的右子树中思路:1.如果p,q都在左子树中(p.val<root.val&&q.val<root.val),迭代至root.left;2.如果p,q都在右子树中(p.val>root.val&&q.val>root.val),迭代至root.right;3.其他.原创 2020-10-24 12:27:04 · 230 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数java题解
1.题目2.分析数字越界处理在每轮拼接前,判断res拼接后是否超过2147483647,若超过则加上符号位直接返回。两种越界情况:3.代码3.1 空间复杂度O(N)的代码代码class Solution { public int strToInt(String str) { //字符串为空,返回0 if(str==null) return 0; //删除首尾空格 char[] cs=str.原创 2020-10-23 13:08:34 · 161 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组java题解
1.题目B[i]的值是A中除了A[i]以外所有元素的乘积。2.分析本题难点在于不让用除法。整体思路,结果集中任何一个元素 = 其左边所有元素的乘积 * 其右边所有元素的乘积。一轮循环构建左边的乘积并保存在结果集中,二轮循环构建右边乘积的过程,乘以左边的乘积,并将最终结果保存。3.代码class Solution { public int[] constructArr(int[] a) { if(a.length==0) return new i原创 2020-10-23 09:01:22 · 196 阅读 · 1 评论 -
剑指 Offer 64. 求1+2+…+n java题解
1.题目2.解法2.1 递归——逻辑运算符的短路2.1.1 思路n=0时退出递归。但题目不允许用if等关键字。利用逻辑运算符的短路特性,我们可以将判断是否为递归的出口看作 A && B 表达式中的 A 部分,递归的主体函数看作 B 部分。如果不是递归出口,则返回 True,并继续执行表达式 B 的部分,否则递归结束。当然,你也可以用逻辑运算符 || 给出类似的实现,这里我们只提供结合逻辑运算符 && 的递归实现。2.1.2 代码n<=0时退出class原创 2020-10-22 09:43:06 · 191 阅读 · 1 评论 -
剑指 Offer 63. 股票的最大利润java题解
科科科1.题目2.分析转移方程:前i日最大利润=max(前(i−1)日最大利润,第i日价格−前i日最低价格)3.代码class Solution { public int maxProfit(int[] prices) { if(prices.length==0||prices.length==1) return 0; int res=0; int min=Integer.MAX_VALUE; for原创 2020-10-22 09:17:28 · 223 阅读 · 1 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字java题解
1.题目2.分析一眼看出是个约瑟夫环问题。但已经忘记了大一学的…3.代码class Solution { public int lastRemaining(int n, int m) { int k=0; for(int i=1;i<n;i++){ k=(k+m)%(i+1); } return k; }}4.复杂度时间复杂度:O(N)空间复杂度:O(1)5.结果...原创 2020-10-21 13:07:01 · 100 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子java题解
就不是很懂题目的意思,顺子是啥,遂去看题解1.题目2.分析根据题意,此 5张牌是顺子的 充分条件 如下:除大小王外,所有牌无重复 ;设此 5张牌中最大的牌为max ,最小的牌为min (大小王除外),则需满足:max−min<5遇到大小王(0)跳过,用set判重,借助辅助变量max,min。3.代码class Solution { public boolean isStraight(int[] nums) { HashSet<Integer&g.原创 2020-10-21 11:22:49 · 175 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数java题解
写不下去了明天见1.题目2.分析状态表示:dp[i][j] ,表示投掷完i枚骰子后,点数j的出现次数。初始状态:表示投掷完i枚骰子后,点数和是[1,6],即dp[1][k]=i;(k从1到6)找出状态转移方程代码在这里插入代码片...原创 2020-10-20 19:56:10 · 139 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值java题解
1.题目2.分析使用O(1) 时间复杂度来获得队列或栈的最大值或者最小值,往往需要使用一个辅助的数据结构实现,具体选用何种数据结构需要在做题过程中总结规律。push_back和pop_front,用普通的双端队列就可以实现O(1)。对于max_value,需要保证队首元素始终最大,可用一个辅助的单调队列实现(内部元素递减)。①队列为空,直接添加到队尾;队列不为空,继续②;②队列最后一个元素(peekLast)大于当前元素,将当前元素添加到队尾;③队列最后一个元素(peekLast)小于当前元原创 2020-10-20 19:34:15 · 154 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值java题解
日日日日记:运动并不能给我带来快乐。There had been only bitterness.1.题目在主站leetcode239,是一道困难题。2.分析3.单调队列介绍比起普通的双端队列(Li)4.代码5.复杂度时间复杂度O(N):N是数组nums的长度。遍历数组需要O(N)。单调队列最多入队一次+出队一次,需要O(2N)。空间复杂度O(k):单调队列中最多同时有k个元素。6.结果...原创 2020-10-20 09:12:53 · 166 阅读 · 1 评论 -
剑指 Offer 58 - II. 左旋转字符串java题解
由于本题的多解法涉及到了 字符串为不可变对象 的相关概念,导致效率区别较大。1.2.我的暴力解法代码class Solution { public String reverseLeftWords(String s, int n) { char[] a=s.toCharArray(); char[] b=new char[a.length]; int c=0; for(int i=n;i<a.length;i++){原创 2020-10-19 09:06:41 · 103 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法java题解
举例 求20+1720=0001 0100 17=0001 0001循环1: c=(0001 0000)<<1=0010 0000 ;a=a^b=0000 0101;b=c=0010 0000循环2: c=(0000 0101 & 0010 0000)<<1=(0000 0000)<<1=0000 0000 ;a=a^b=(0000 0101 ^ 0010 0000)=0010 0101;b=c=0return a=0010 0101=37代原创 2020-09-16 10:46:13 · 118 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序java题解
2020.9.1 题嘛不会写 肚子又饿了 呜呜呜明天再写吧class Solution { public String reverseWords(String s) { //StringBuffer res=new StringBuffer(""); char[] str=s.toCharArray(); char[] res=new char[str.length]; int i=0; while(str[i]=.原创 2020-09-01 22:25:24 · 164 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列java题解
今天的心情依旧是 我怎么这么菜啊呜呜呜呜呜1.题目输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。2.思路1.本题运用了滑动窗口:假设窗口的左边界为i,右边界为j,区间是左开右闭 [i,j)。滑动窗口的性质是左右边界都只能向右移动。初始条件:i=j=12.滑动窗口范围的数的和就是要找的和为target的序列①如果 和>target, 要缩小窗口,那么左边界向右移动,即i+.原创 2020-08-30 20:32:30 · 214 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字java题解
1.题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。2.思路由于是有序的数组1.双指针法,一个指向low,一个指向high。如果s<nums[low]+nums[high],high-1;如果s>nums[low]+nums[high],low+1;如果s=nums[low]+nums[high],返回数组{nums[low],nums[high]};当low=high时跳出循环。3.复杂度时间复原创 2020-08-30 17:42:17 · 170 阅读 · 0 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 IIJava题解
题目在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。思路这题紧接着上一题,剑指 Offer 56 - I. 数组中数字出现的次数java题解1.三个相同的数字的异或结果还是该数字,所以不能像上一题那样,但沿用了位运算的思路。2.三个相同的数字二进制每一位加起来必然可以整除3,由于有只出现一次的一个数字a,不能整除3的说明a的那一位为1,能整除3的说明a的那一位为0。3.上述思路同样适用于数组中一个数字出现一次,其他数字出现奇数次问题(如果是偶数原创 2020-08-29 20:36:21 · 220 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数java题解
立个flag 再不认真写思路是????思路1.两个相同的数异或结果为0,如果有一个只出现一次的数a,那么数组中所有数的异或结果为这个数a。2.本题有两个只出现一次的数a和b,数组最后的异或结果就是这两个数异或的结果a^b。3.如果将数组中的数分成两组,a、b分别在这两组,那么这两组数分别异或的结果就是a和b了。4.问题是怎么分组呢①先异或所有数,得到k=a^b②需要找到a,b不一样的位置,即k中是1的位。方法是 设置mark=1,若(mark&k)==0,mark左移一位③遍历数原创 2020-08-29 19:23:52 · 242 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树Java题解
感觉8月比7月摸鱼了许多,题也不是天天写。不会写还记不住,暴风哭泣,好累啊代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public boolean is.原创 2020-08-29 11:21:14 · 187 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度java题解
日记:今天为什么做了好几道呢因为笔试面试我好累我懒死了我好菜代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { private int count=0,max=.原创 2020-08-26 21:37:27 · 138 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点java题解
1.思路中序遍历可以得到递增的序列,所以寻求第k大的数,就用中序遍历的倒序(即先遍历右子树,再根节点,最后左子树)2.代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution {原创 2020-08-26 20:44:13 · 182 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字java题解
class Solution { public int missingNumber(int[] nums) { int i=0,j=nums.length-1; while(i<=j){ int m=(i+j)/2; if(nums[m]==m) i=m+1; else j=m-1; } retu原创 2020-08-26 16:18:05 · 116 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字java题解
class Solution { public int search(int[] nums, int target) { int len=nums.length; if(len==0){ return 0; } //初始化 int left=0; int right=len-1; int mid; //找右边界 while(left&原创 2020-08-23 10:54:31 · 159 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点java题解
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode getIntersectionNod原创 2020-08-23 10:22:05 · 172 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对java题解
class Solution { public int reversePairs(int[] nums) { int len=nums.length; //长度0或1,无逆序对,直接返回0 if(len<2){ return 0; } int[] temp=new int[len];//临时数组 int[] copy=new int[len]; for(int原创 2020-08-22 10:09:58 · 121 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符java题解
class Solution { public char firstUniqChar(String s) { //有序的集合 Map<Character,Boolean> map=new LinkedHashMap<>(); char[] c=s.toCharArray(); for(char cr:c){ map.put(cr,!map.containsKey(cr));原创 2020-08-21 10:26:33 · 121 阅读 · 0 评论 -
剑指 Offer 49. 丑数java题解
class Solution { public int nthUglyNumber(int n) { int[] dp=new int[1691]; int a=0,b=0,c=0; dp[0]=1; for(int i=1;i<n;i++){ int n2=dp[a]*2; int n3=dp[b]*3; int n5=dp[c]*5;原创 2020-08-21 10:04:10 · 110 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串java题解
class Solution { public int lengthOfLongestSubstring(String s) { Map<Character,Integer> dic=new HashMap<>(); int temp=0,res=0,i=0; for(int j=0;j<s.length();j++){ i=dic.getOrDefault(s.charAt(j),-1);原创 2020-08-20 10:50:44 · 217 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值Java题解
1.思路设f(i,j)为从棋盘左上角走至单元格(i,j)的礼物最大累计价值,得到以下递推关系:f(i,j) 等于f(i,j−1) 和f(i−1,j) 中的较大值加上当前单元格礼物价值grid[i,j]2.代码class Solution { public int maxValue(int[][] grid) { int m=grid.length; int n=grid[0].length; for(int i=1;i<m;i++){原创 2020-08-19 10:24:41 · 188 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串Java题解
class Solution { public int translateNum(int num) { String str=String.valueOf(num); int len=str.length(); if(len<2) return len; char[] c=str.toCharArray(); return dp(c); } public int dp(cha原创 2020-08-15 09:06:20 · 171 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数java题解
class Solution { public String minNumber(int[] nums) { String[] str=new String[nums.length]; for(int i=0;i<nums.length;i++){ str[i]=String.valueOf(nums[i]); } mysort(str,0,str.length-1); StringBuil原创 2020-08-13 21:16:07 · 126 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字java题解
class Solution { public int findNthDigit(int n) { int digit=1; long start=1; long count=9; while(n>count){ n-=count; digit=digit+1; start=start*10; count=start*digit*9;原创 2020-08-12 13:53:10 · 144 阅读 · 0 评论 -
剑指 Offer 43. 1~n整数中1出现的次数java题解
时间复杂度O(log(n)) 空间复杂度O(1)每轮的结果算法,由找规律得到class Solution { public int countDigitOne(int n) { int res=0; int high=n/10,cur=n%10,low=0,digit=1; while(high!=0||cur!=0){ if(cur==0) res+=high*digit;原创 2020-08-11 10:04:02 · 144 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和java题解
class Solution { public int maxSubArray(int[] nums) { int res=nums[0]; for(int i=1;i<nums.length;i++){ if(nums[i-1]>0){ nums[i]+=nums[i-1]; } if(nums[i]>res){原创 2020-08-10 10:24:23 · 130 阅读 · 0 评论 -
剑指 Offer 41. 数据流中的中位数java题解
class MedianFinder { PriorityQueue<Integer> a,b; /** initialize your data structure here. */ public MedianFinder() { a=new PriorityQueue<>();//小顶堆 存储较大的一半 b=new PriorityQueue<>((x, y) -> (y - x));//大顶堆 存储较小的原创 2020-08-10 10:06:15 · 145 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数java题解
快排:https://blog.csdn.net/nrsc272420199/article/details/82587933class Solution { public int[] getLeastNumbers(int[] arr, int k) { if(k==0||arr.length==0){ return new int[0]; } return quickSearch(arr,0,arr.length-1,k-原创 2020-08-09 10:48:27 · 155 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字java题解
参考:如何理解摩尔投票算法? - 喝七喜的回答 - 知乎https://www.zhihu.com/question/49973163/answer/235921864 public int majorityElement(int[] nums) { int flag=0; int count=0; for(int num:nums){ if(count==0){ flag=num;原创 2020-08-09 10:02:03 · 199 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列java题解
class Solution { List<String> res=new LinkedList<>(); char[] c; public String[] permutation(String s) { c=s.toCharArray();//String转char[] dfs(0); return res.toArray(new String[res.size()]);//List转String[]原创 2020-08-08 14:39:53 · 228 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表java题解
/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node() {} public Node(int _val) { val = _val; } public Node(int _val,Node _left,Node _right) { val = _val;原创 2020-08-07 10:44:34 · 197 阅读 · 0 评论