剑指offer
VilliamKalin
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 68 - II. 二叉树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先思路注意,这里不是二叉搜索树了因此判断方法有点区别如果根节点为空,或者根节点等于某个节点那么直接返回根结点以左右节点去搜索如果左右都为空,直接返回null如果左为空右不空,返回右节点如果右为空左不空,返回左节点如果左右都不可,返回根节点代码 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(roo原创 2021-09-13 09:22:55 · 59 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先思路因为是二叉搜索树,因此可以判断起来比较容易,节点只可能在左右子树如果都小于根结点,那么就查看是否在左子树如果都大于根结点,那么就查看是否在右子树否则,直接返回根节点代码 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(p.val<root.val&&q.val<root原创 2021-09-13 09:26:21 · 56 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数
剑指 Offer 67. 把字符串转换成整数思路1.判断第一位是不是+/-2.判断是否存在非数字3.判断是否越界,越界返回极值极值是Integer.MAX_VALUE,由于我们是逐位转化的,因此考虑极值Integer.MAX_VALUE/10,如果当前值大于Integer.MAX_VALUE/10,直接返回极值;如果当前值等于Integer.MAX_VALUE/10,然后当前个位>7,也直接返回极值。4.res=10*res+ch[i]-‘0’代码 public int str原创 2021-09-13 09:22:42 · 98 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
剑指 Offer 66. 构建乘积数组LeetCode-238-除自身以外数组的乘积原创 2021-09-13 09:22:06 · 64 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法思路使用位运算,同时必须考虑进位参考面试题65. 不用加减乘除做加法(位运算,清晰图解) - 不用加减乘除做加法 - 力扣(LeetCode) (leetcode-cn.com)代码 public int add(int a, int b) { while(b!=0){//进位和不为0 int c=(a&b)<<1;//计算进位和 a^=b;//计算和原创 2021-09-13 09:21:50 · 73 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
剑指 Offer 64. 求1+2+…+n思路注意,该题不允许使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)因此只能考虑使用位运算通过位运算来递归加法代码class Solution { int res=0; public int sumNums(int n) { boolean x=(n>1)&&sumNums(n-1)==1; res+=n; r原创 2021-09-13 09:23:17 · 66 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润
剑指 Offer 63. 股票的最大利润LeetCode-121-买卖股票的最佳时机原创 2021-09-12 10:20:08 · 61 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字
剑指 Offer 62. 圆圈中最后剩下的数字思路约瑟夫环,只是不是链表暴力法不可以参考剑指 Offer 62. 圆圈中最后剩下的数字(数学 / 动态规划,清晰图解) - 圆圈中最后剩下的数字 - 力扣(LeetCode) (leetcode-cn.com)这里推导有点难懂存在递推 dp[i]=(dp[i−1]+m)%i最后返回dp[n]代码 int []dp=new int[n+1]; for(int i=2;i<=n;i++){原创 2021-09-12 10:19:53 · 67 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
剑指 Offer 61. 扑克牌中的顺子思路1.为了更好地检查顺子,那么就先对数组进行排序2.遍历数组,计算0(鬼牌的数量)3.遍历时,如果存在除0外相同的牌,那么直接返回false4.最后判断最后一张牌和第一张非鬼牌的差距是否小于5,在5之内说明可以用鬼牌弥补顺序代码 public boolean isStraight(int[] nums) { int j=0; Arrays.sort(nums); for(int i=0;i<原创 2021-09-12 10:19:35 · 68 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数思路暴力,不可以,因为是指数增长的6 ^ n那么就找规律吧参考剑指 Offer 60. n 个骰子的点数(动态规划,清晰图解) - n个骰子的点数 - 力扣(LeetCode) (leetcode-cn.com)代码 public double[] dicesProbability(int n) { double []dp=new double[6]; Arrays.fill(dp,1.0/6.0);原创 2021-09-12 10:19:23 · 69 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值
剑指 Offer 59 - II. 队列的最大值思路这里一开始或许会以为和最小栈一样,但是并不一样,比如入队2,队列2,最大队列2,入队4,队列2,4,最大队列2,4,那么这个时候求最大队列值,弹出2,这是不对的。因此应该换种思路维护一个双向队列,该队列应该是单调递减的当入队时,如果入队元素大于队尾元素,那么就依次出队尾,然后入队当出队时,如果出队元素等于队首元素,那么也出队首代码class MaxQueue { Queue<Integer> q1; Deque&原创 2021-09-12 10:18:56 · 65 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串思路遍历就好代码 public String reverseLeftWords(String s, int n) { StringBuilder res=new StringBuilder(""); for(int i=n;i<s.length();i++){ res.append(s.charAt(i)+""); } for(int i=0;i<原创 2021-09-12 10:19:07 · 57 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序思路从后往前遍历添加即可代码 public String reverseWords(String s) { s=s.trim(); StringBuilder res=new StringBuilder(""); int i=s.length()-1,j=i; while(i>=0){ while(i>=0&&s.charAt(i原创 2021-09-12 10:18:44 · 73 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列思路滑动窗口代码 public int[][] findContinuousSequence(int target) { List<int []>res=new ArrayList<>(); int i=1,j=2,s=3; while(i<j){ if(s==target){ int []tmp=new in原创 2021-09-12 10:18:32 · 63 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
剑指 Offer 57. 和为s的两个数字LeetCode-001-两数之和原创 2021-09-11 09:21:55 · 56 阅读 · 0 评论 -
剑指 Offer 56. 数组中数字出现的次数(I、II)
剑指 Offer 56 - I. 数组中数字出现的次数思路异或这次有2个出现一次的数,因此异或的结果是两个数的异或。必须想办法分开。这两个数肯定是不一样的,那么我们取异或结果的最右边的1(x&(-x)),可以通过这一位来区分。然后把这两组元素分别异或,得到2个数就是所求数代码 public int[] singleNumbers(int[] nums) { int []res=new int[2]; int xor=0; for(原创 2021-09-12 10:18:06 · 63 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
剑指 Offer 55 - II. 平衡二叉树思路老样子1.当前节点为根节点,是否平衡2.左右节点为根节点,是否平衡代码class Solution { public boolean isBalanced(TreeNode root) { if(root==null)return true; int l=dfs(root.left),r=dfs(root.right); return (Math.abs(l-r)<=1)&&原创 2021-09-13 09:23:07 · 71 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
剑指 Offer 55 - I. 二叉树的深度LeetCode-104-二叉树的最大深度原创 2021-09-11 09:23:09 · 55 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
剑指 Offer 54. 二叉搜索树的第k大节点思路由于是二叉搜索树,因此只需要按照中序遍历即可,但是它要求找到第k大的值,因此应该反中序遍历代码class Solution { int res,k; public int kthLargest(TreeNode root, int k) { this.k=k; dfs(root); return res; } public void dfs(TreeNode root原创 2021-09-11 09:22:57 · 55 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - II. 0~n-1中缺失的数字思路这里仔细研究一下,可以发现题目描述有些不正确,正确意思应该是在一个长度为n的数组中,每个数字都是唯一的,数字范围是0 ~ n,那么说明有一个数字不存在,因此只需要对所有元素依次异或,然后异或1 ~ n,那么最后得到的值就是不出现的数字代码 public int missingNumber(int[] nums) { int res=0; for(int i=0;i<nums.length;i++原创 2021-09-11 09:22:47 · 70 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I思路二分法查找最右值(可能有多个,因此找最右边的)然后查找target和target-1,返回的最右值差就是target的个数代码 public int search(int[] nums, int target) { return helper(nums,target)-helper(nums,target-1); } int helper(int[] nums, int target) {原创 2021-09-11 09:22:35 · 49 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点LeetCode-160-相交链表原创 2021-09-10 09:28:35 · 50 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符思路使用哈希表存放次数,这里其实用Boolean作为值,值为!set.containsKey(key),如果第一次那么就会是true,多次就都是false代码 public char firstUniqChar(String s) { HashMap<Character,Boolean> map=new HashMap<>(); char []ch=s.toCharArray();原创 2021-09-10 09:28:20 · 54 阅读 · 0 评论 -
剑指 Offer 49. 丑数
剑指 Offer 49. 丑数思路丑数的定义:只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)这里其实少说了一点,由2、3、5乘丑数的数也是丑数如8=24=22*2,4是丑数,8也是丑数那么我们只需要以dp数组乘2、3、5,得到的结果最小值就是当前位置丑数,dp[0]=1,丑数下标a、b、c都为0代码 public int nthUglyNumber(int n) { int a=0,b=0,c=0; int []dp=new in原创 2021-09-11 09:21:42 · 61 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串LeetCode-003-无重复字符的最长子串原创 2021-09-11 09:21:22 · 52 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值思路经典动态规划初始化首行首列,dp[i][j]=max(dp[i-1][j],dp[i][j-1])代码 public int maxValue(int[][] grid) { int m=grid.length,n=grid[0].length; int [][]dp=new int[m][n]; dp[0][0]=grid[0][0]; for(int i=1;i<m;i++原创 2021-09-11 09:21:07 · 48 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
剑指 Offer 46. 把数字翻译成字符串思路动态规划1.dp[i]表示[0…i]所能翻译的种类2.一次可以翻译1个或者2个数字,那么如果i-1、i位都可以那么dp[i]=dp[i-2]+dp[i-1];否则dp[i]=dp[i-1]3.dp[0]=dp[1]=1;dp[1]等于1显而易见,一个数字肯定可以翻译;dp[0]的解释就是,dp[0]=dp[2]-dp[1],也就是如果0、1位置合起来可以翻译,那么dp[2]=2,dp[0]=1代码 public int translateN原创 2021-09-11 09:20:47 · 63 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
剑指 Offer 45. 把数组排成最小的数思路看一下下面这个例子,存在元素3、30,把他们连接起来,那么就有3+30=330,30+3=303,也就是30+3<3+30,那么我们只要按照这个规律连接所有元素就好。因此需要把所有元素转化成字符串,通过比较x+y和y+x的大小,如果x+y<y+x,那么x放前面,y放后面代码 public String minNumber(int[] nums) { String []strs=new String[nums.len原创 2021-09-11 09:20:18 · 60 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字
剑指 Offer 44. 数字序列中某一位的数字思路参考 面试题44. 数字序列中某一位的数字(迭代 + 求整 / 求余,清晰图解) - 数字序列中某一位的数字 - 力扣(LeetCode) (leetcode-cn.com)这是道数学题,找规律1.确定n所在 数字 的 位数 ,记为digit ;2.确定n所在的 数字 ,记为num ;3.确定n是num中的哪一数位,并返回结果。代码 public int findNthDigit(int n) { int digit原创 2021-09-10 09:27:53 · 81 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和LeetCode-053-最大子序和_HuangMuCheng的博客-CSDN博客原创 2021-09-10 09:23:53 · 50 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数思路排序(快排)代码class Solution { public int[] getLeastNumbers(int[] arr, int k) { quickSort(arr,0,arr.length-1); return Arrays.copyOf(arr,k); } public void quickSort(int[] arr,int l,int r){ if(l>=r)r原创 2021-09-08 15:21:43 · 56 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字LeetCode-169-多数元素原创 2021-09-08 15:21:21 · 52 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列
剑指 Offer 38. 字符串的排列思路回溯使用set保存当前遍历中出现过的字母遍历时,如果是当前未出现过的字母,添加到集合,交换顺序,进行回溯,回退交换代码class Solution { List<String> res=new ArrayList<>(); char []c; public String[] permutation(String s) { c=s.toCharArray(); dfs(0);原创 2021-09-08 15:21:06 · 57 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表思路中序遍历,各个指针设置好即可代码class Solution { Node head,pre; public Node treeToDoublyList(Node root) { if(root==null)return null; dfs(root); head.left=pre; pre.right=head; return head; }原创 2021-09-08 15:20:58 · 59 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制思路参考 剑指 Offer 35. 复杂链表的复制(哈希表 / 拼接与拆分,清晰图解) - 复杂链表的复制 - 力扣(LeetCode) (leetcode-cn.com)1.复制各节点,构建拼接链表:2.构建新链表各节点的 random 指向:3.当访问原节点 cur 的随机指向节点 cur.random 时,对应新节点 cur.next 的随机指向节点为 cur.random.next 。4.拆分原 / 新链表:代码 public Node原创 2021-09-10 09:24:24 · 49 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径思路从根节点到叶节点的路径和等于目标值需要获得路径,回溯即可,在最后回退代码class Solution { List<List<Integer>> res=new ArrayList<>(); LinkedList<Integer> path=new LinkedList<>(); public List<List<Integer>> p原创 2021-09-10 09:27:39 · 55 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列思路参考 面试题33. 二叉搜索树的后序遍历序列(递归分治 / 单调栈,清晰图解) - 二叉搜索树的后序遍历序列 - 力扣(LeetCode) (leetcode-cn.com)后序遍历的特点就是当前数组区间的最后一个元素就是根节点,如何找到左右子树的区间呢,从左到右遍历,找到第一个大于根节点的节点,该节点之前都是左子树,其余为右子树。判断是否是后序遍历,只需判断从找到的右子树起点开始是否都大于根节点。然后再对左右子树各自判断是否满足后序遍历代原创 2021-09-10 09:27:33 · 72 阅读 · 0 评论 -
剑指 Offer 32 . 从上到下打印二叉树(I、II、III)
剑指 Offer 32 - I. 从上到下打印二叉树思路层次遍历代码public int[] levelOrder(TreeNode root) { if(root==null)return new int[0]; List<Integer> list=new ArrayList<>(); Queue<TreeNode> q=new LinkedList<>(); q.add(root)原创 2021-09-10 09:27:24 · 55 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
剑指 Offer 31. 栈的压入、弹出序列思路每次入栈后都进行检测,如果当前栈顶元素等于出栈序列的元素就弹出,循环知道不相等,最后判断栈是否为空代码 public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> st2=new Stack<>(); int j=0; for(int i=0;i<pushed.l原创 2021-09-10 09:27:17 · 56 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈LeetCode-155-最小栈原创 2021-09-10 09:27:08 · 51 阅读 · 0 评论