剑指offer
文章平均质量分 74
puspos
这个作者很懒,什么都没留下…
展开
-
剑指offer_数字在排序数组中出现的次数
问题例子统计一个数字在排序数组中出现的次数。思路方法1O(n)方法2O(logn) 二分代码//方法1 O(n) public int GetNumberOfK(int [] array , int k) { int res=0; for(int n: array) { if(n==k) res++; if(n!=k && res>=1) break;原创 2020-05-15 10:06:50 · 95 阅读 · 0 评论 -
剑指offer_二叉树的下一个结点
问题例子思路方法1方法21: 如果该结点有右子树,则返回右子树最深的左子树2:如果该结点没有右子树,不断向上找该结点的父结点。2.1:如果存在某个父节点,是其父节点的左子树,则返回其父节点2.2:如果不存在某个父节点,是其父节点的左子树,则返回null代码//方法1import java.util.*;public class Solution { private TreeLinkNode res = null; public TreeLinkN原创 2020-05-14 16:00:17 · 203 阅读 · 0 评论 -
297. 二叉树的序列化与反序列化_面试题37. 序列化二叉树
问题请实现两个函数,分别用来序列化和反序列化二叉树。例子思路中间转化成的字符串随意,只要最后能还原二叉树即可为空是,使用“#”代替中序遍历不行,因为没法知道根结点在哪【但是也可以通过在给右子树加括号来实现】方法1$$$$先序+队列方法2$$$$后序+栈方法3层次遍历序列化后的反序列化代码//方法1public class Co...原创 2020-04-02 17:12:47 · 144 阅读 · 0 评论 -
138. 复制带随机指针的链表_面试题35. 复杂链表的复制
问题例子思路直接遍历结点的话,因为random是随机的,有没有创建不知道,所以使用辅助map,旧结点,新结点【遍历结点,复制一份,并放在map中与原结点进行映射】,则原结点之间的映射关系,就是新节点之间的映射关系方法1$$$$方法2$$$$代码//方法1/*// Definition for a Node.class Node { int v...原创 2020-04-02 11:44:51 · 97 阅读 · 0 评论 -
面试题51. 数组中的逆序对_315. 计算右侧小于当前元素的个数
问题例子思路暴力方法,两个for循环,超时方法1$$$$方法2$$$$代码//方法1//方法2原创 2020-04-02 11:11:32 · 168 阅读 · 0 评论 -
面试题26. 树的子结构
问题例子思路遍历树a,把a的子树结构和b进行比较比较时,只要b进行到null,不管a进行到是不是null,返回true方法1$$$$方法2$$$$代码//方法1class Solution { private boolean res = false; public boolean isSubStructure(TreeNode A, ...原创 2020-04-01 22:14:38 · 121 阅读 · 0 评论 -
233. 数字 1 的个数_面试题43. 1~n整数中1出现的次数
问题例子思路暴力法超时(两个for)方法1$$$$方法2$$$$代码//方法1class Solution { public int countDigitOne(int n) { int res=0,i=1,num=n; while(num>0){ if(num%10==0) res+...原创 2020-04-01 21:56:04 · 120 阅读 · 0 评论 -
400. 第N个数字_面试题44. 数字序列中某一位的数字
问题例子思路方法1$$$$确定位数【i位数共有多少位数字:10*(i-1)9i】确定所在的数字确定是哪一位数方法2$$$$代码//方法1class Solution { public int findNthDigit(int n) { //所在数字是i位 int i=1; //当n为10...原创 2020-04-01 20:52:33 · 160 阅读 · 0 评论 -
面试题14- II. 剪绳子 II
问题例子思路跟剪绳子1不一样的是,n的范围变大,剪绳子1中n<=58,此时结果<Integer.MAX_VALUE,此题:n<=1000,所以中间结果会出现>int的最大值,和大于long的最大值,只能使用BigInteger,比较麻烦所以:采用贪心算法可以看到当n>=5时,最大结果总是先割下来长度3,不够5, 直接保留【因为4的最大结果为4(22...原创 2020-04-01 12:41:49 · 238 阅读 · 1 评论 -
79. 单词搜索_面试题12. 矩阵中的路径
问题例子思路不知道哪个第一个符合的字符,即不知道从哪开始,所以:两个for循环深度优先+回溯【因为要找到路径】直接在二维数组中修改,标记已访问,节省used空间方法1$$$$方法2$$$$代码//方法1class Solution { public boolean exist(char[][] board, String word) {...原创 2020-04-01 11:38:54 · 103 阅读 · 0 评论 -
面试题46. 把数字翻译成字符串
问题例子思路方法1$$$$方法2$$$$回溯,不只得到有几种,还得到每种分别是什么代码//方法1//方法2class Solution { public int translateNum(int num) { char[] arr = String.valueOf(num).toCharArray(); L...原创 2020-04-01 10:18:07 · 120 阅读 · 0 评论 -
面试题59 - II. 队列的最大值
问题请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1例子思路本质是求滑动窗口最大值的问题。这个队列可以看成是一个滑动窗口,入队就是将窗口的右边界右移,出队就是将窗口的左边界右移。只用一个队列时,...原创 2020-03-31 22:22:17 · 177 阅读 · 0 评论 -
239. 滑动窗口最大值_面试题59 - I. 滑动窗口的最大值
问题例子思路方法1 暴力$$$$方法2$$$$代码//方法1class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length==0) return new int[0]; int[] res = new int[nu...原创 2020-03-31 20:56:46 · 132 阅读 · 0 评论 -
面试题13. 机器人的运动范围
问题例子思路方法1$$$$就是看能走到的范围。说是前后左右都可以移动过来,但其实,只往下,往右走即可,看能走到的最多方块方法2$$$$代码//方法1class Solution { public int movingCount(int m, int n, int k) { boolean[][] used = new bool...原创 2020-03-31 17:31:36 · 184 阅读 · 0 评论 -
面试题60. n个骰子的点数
问题例子思路方法1f(n,j):n个筛子,和为j的情况的个数当j>6时:因为一个骰子有六个点,第n个骰子可能出现1到6的点。所以第n个骰子点数为1时,f(n,j)=f(n−1,j−1),当第n个骰子点数为2的话,f(n,j)=f(n−1,j−2),…,依次类推f(n,j)=f(n−1,j−1)+f(n−1,j−2)+f(n−1,j−3)+f(n−1,j−4)+f(n−1,j−...原创 2020-03-31 11:38:08 · 214 阅读 · 0 评论 -
3.无重复字符的最长子串_面试题48. 最长不含重复字符的子字符串
描述Given a string, find the length of the longest substring without repeating 》 characters.给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度例子思路使用滑动窗口:[i,j],且只能向前滑用字典保存已经字符串中出现的字符的上一个出现的下标使用下标j遍历字符串,如果该字符已经...原创 2019-10-28 14:36:06 · 153 阅读 · 0 评论 -
50. Pow(x, n)_面试题16. 数值的整数次方
问题实现 pow(x, n) ,即计算 x 的 n 次幂函数。例子思路方法1 O(n)暴力法 超时将多个相乘方法2 O(logn)代码//循环法public double myPow(double x, int n) { //因为n可能无法由负的变成正的,如:Integer.MIN_VALUE的负数还是负数 long nn...原创 2020-03-12 17:22:08 · 202 阅读 · 1 评论 -
257. 二叉树的所有路径——113.路径总和II_面试题34. 二叉树中和为某一值的路径
问题给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。例子思路代码原创 2020-01-30 21:59:50 · 1162 阅读 · 0 评论 -
47全排列II_面试题38. 字符串的排列
问题给定一个可包含重复数字的序列,返回所有不重复的全排列。例子思路回溯代码class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> list = new ArrayList<&...原创 2020-02-29 20:23:33 · 125 阅读 · 0 评论 -
179. 最大数_面试题45. 把数组排成最小的数
问题给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。例子思路考虑使用排序法则【要输出最大的值】:(10,2)->210-102因为可能数字要大于Integer.MAX_VALUE,所以使用字符串比较代码class Solution { public String largestNumber(int[] nums) { String[] ar...原创 2020-03-08 22:04:01 · 134 阅读 · 1 评论 -
946. 验证栈序列_面试题31. 栈的压入、弹出序列
问题例子思路方法1$$$$把pushed数组依次装入栈,同时让栈按照popped数组弹出元素,如果最终栈为空,则为true方法2$$$$代码//方法1class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Stac...原创 2020-03-30 20:35:00 · 143 阅读 · 0 评论 -
426. 将二叉搜索树转化为排序的双向链表_面试题36. 二叉搜索树与双向链表
问题例子思路first为第一个结点,即最小值的结点pre为每次操作结点时的前一个结点,最终变成最后一个结点,即最大值的结点first可看作head,pre可看作cur,采用尾插法进行构造双向链表方法1$$$$方法2$$$$代码//方法1 递归class Solution { private Node first; private N...原创 2020-03-30 17:47:40 · 158 阅读 · 0 评论 -
264. 丑数 II_面试题49. 丑数
问题我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。例子思路方法1$$$$丑数:只能由2,3,5相乘得到的数。即由丑数2或3或5才能得到丑数使用三个指针,i2,i3, i5,分别表示与2,3,5相乘的丑数下标,每次从其中得到一个最小的丑数,放进res数组,将该对应的i2或i3或i5下标+1。即2,*3,*5的...原创 2020-03-30 10:17:29 · 135 阅读 · 0 评论 -
137. 只出现一次的数字 II_面试题56 - II. 数组中数字出现的次数 II
问题给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。例子思路方法1 O(n) O(n)map方法2 O(nlogn) O(1)先排序方法3 O(n) O(1)== 相当于搞了一个三进制出来。==出现一次n时,让one为n【此时two为0】,出现两次n时,让two为n【此时one为0】,出现三次n时,o...原创 2020-03-11 21:09:00 · 152 阅读 · 0 评论 -
260. 只出现一次的数字 III_面试题56 - I. 数组中数字出现的次数
问题给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。例子思路方法1 O(n) O(n)map方法2 O(n) O(1)异或代码//方法1class Solution { public int[] singleNumber(int[] nums) { Map<Int...原创 2020-03-11 22:33:41 · 160 阅读 · 0 评论 -
面试题64. 求1+2+…+n
问题求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。例子思路方法1$$$$&&代替ifa && b a为true时,才进行验证b方法2$$$$代码//方法1class Solution { public int sumNu...原创 2020-03-29 17:20:58 · 125 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树_面试题07. 重建二叉树
问题根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例子思路前序遍历:遍历顺序为 父节点 -> 左子节点 -> 右子节点后续遍历:遍历顺序为 左子节点 -> 父节点 -> 右子节点方法1$$$$前序遍历的第一个节点是根节点,找到根节点在中序遍历中的位置,中序遍历中,根节点之前的节点都位于左子树,根节点之后的节点都位...原创 2020-03-29 11:21:59 · 121 阅读 · 0 评论 -
230. 二叉搜索树中第K小的元素_面试题54. 二叉搜索树的第k大节点
问题给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。例子思路二叉搜索树中序遍历得到从小到大的顺序方法1中序遍历+list保存遍历的结点方法2使用全部变量【res和n:因为int型作为参数是值传递,无法保存每次操作后的值】,保存第k个值,和现在数到第几个数代码//方法1 public int kthSmallest...原创 2020-03-19 09:09:58 · 116 阅读 · 0 评论 -
面试题61. 扑克牌中的顺子
问题例子思路方法1先排序,计算0的个数,再计算缺少的个数,2,5缺少2个【5-2-1=2】,如果0的个数>=缺少的个数,则可以,否则不可以方法2遍历数组,如果重复直接返回false【用boolean数组,arr[n]表示该数是否已经出现】,获取最大值和最小值,max,minmax-min>5说明连起来大于5张牌,直接falsemax-min<=5...原创 2020-03-14 17:41:47 · 241 阅读 · 0 评论 -
232. 用栈实现队列_剑指offer_面试题09. 用两个栈实现队列
问题例子思路方法1方法2代码//方法1class MyQueue { Stack<Integer> in = new Stack<>(); Stack<Integer> out = new Stack<>(); /** Initialize your data structure here. *...原创 2020-03-14 11:55:08 · 125 阅读 · 0 评论 -
154. 寻找旋转排序数组中的最小值 II_剑指offer-面试题11. 旋转数组的最小数字
问题例子思路左边递增的部分>右边递增的最大值方法1 O(n)遍历方法2 O(logn)二分查找代码//方法1class Solution { public int findMin(int[] nums) { for(int i=1; i<nums.length; i++){ if(nums[i]&...原创 2020-03-14 11:12:06 · 142 阅读 · 0 评论 -
155.最小栈_剑指offer-面试题30. 包含min函数的栈
问题设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素例子MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);mi...原创 2020-01-20 10:09:41 · 121 阅读 · 0 评论 -
剑指offer_面试题28. 二叉树的镜像
问题请完成一个函数,输入一个二叉树,该函数输出它的镜像。例子思路方法1方法2代码//方法1class Solution { public TreeNode mirrorTree(TreeNode root) { if(root==null) return null; TreeNode temp = root.left; ...原创 2020-03-14 09:56:25 · 123 阅读 · 0 评论 -
238. 除自身以外数组的乘积_剑指offer_面试题66. 构建乘积数组
问题例子思路方法1 O(n) O(n)B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]arr[i]=a[0]*…A[i]arr2[i]=A[i]…*A[n-1]方法2 O(n) O(n)对称遍历从左往右遍历累乘,结果保存在数组 ret 中,此时 ret[i]表示,A[i]左边所有元素的乘积然后从右往左遍历累乘,获取A[i] 右边所...原创 2020-03-14 08:33:15 · 154 阅读 · 0 评论 -
54. 螺旋矩阵_剑指offer_面试题29. 顺时针打印矩阵
问题给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。例子思路代码原创 2020-03-07 10:50:39 · 178 阅读 · 0 评论 -
387. 字符串中的第一个唯一字符_剑指offer-面试题50. 第一个只出现一次的字符
问题给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。例子思路map数组代码//map Map<Character,Integer> map = new HashMap<>(); for(int i=0; i<s.length(); i++) { ...原创 2020-03-05 21:28:58 · 153 阅读 · 0 评论 -
169. 多数元素_剑指offer_面试题39. 数组中出现次数超过一半的数字
问题给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素例子思路哈希表 O(n) O(n)利用hash表存储每个元素的count。看哪个元素的count>(int)(len/2)优化:可直接在存的时候,就看其count是否满足条件投票法 O(n) ...原创 2020-01-14 10:50:34 · 400 阅读 · 0 评论 -
107. Binary Tree Level Order Traversal II [二叉树的层次遍历 II]_剑指offer_面试题32 - II. 从上到下打印二叉树 II
描述Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root)一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右...原创 2019-10-11 14:42:18 · 179 阅读 · 0 评论 -
189. 旋转数组_剑指offer_面试题58 - II_左旋转字符串
问题给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数例子思路方法1 拼接法把nums一分为二,前len-k个是一个数组nums1,后k个是一个数组nums2,然后把nums2放前,nums1放后,拼接起来方法2先把前len-k个反转,再把后ke个反转,然后把整个数组反转1234567 3 ->56712341234567->4321...原创 2020-02-21 21:25:32 · 123 阅读 · 0 评论 -
34. 查找某数在有序数组中的第一个和最后一个下标_剑指offer-面试题53 - I. 在排序数组中查找数字 I
描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。例子思路要求O(logn),所以只能时二分查找法,先找左边界,再找有右边界。左右边界不可能一个是-1,一个不是答案pythonclass Solutio...原创 2019-11-21 13:42:44 · 308 阅读 · 0 评论