![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 86
pospre
这个作者很懒,什么都没留下…
展开
-
《剑指offer》 -day1-栈与队列(简单)
剑指 Offer 09. 用两个栈实现队列思路:需要使用一个“输入栈” 和 “输出栈”。入队:直接将元素压入“输入栈”,即可;出队:首先,判断队列是否为空,若为空,则无法处理,直接return -1;然后,判断“输出栈”是否为空:若“输出栈”非空,此时“输出栈”栈顶元素即为“队头元素”,直接弹栈即可;若“输出栈”为空,则将所有输入栈元素转存值输出栈,然后再弹栈,即可class CQueue { Deque<Integer> statckIn;原创 2022-04-01 13:08:16 · 871 阅读 · 0 评论 -
《剑指offer》 -day2-链表(简单)
剑指 Offer 06. 从尾到头打印链表两遍扫描 + 数组倒序思路:第一遍扫描链表,求链表长度 n;第二遍扫描链表,==“倒序”==填充数组 res。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution {原创 2022-04-02 12:55:57 · 669 阅读 · 0 评论 -
《剑指offer》 -day3-字符串(简单)
剑指 Offer 05. 替换空格题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。限制:0<=s的长度<=100000 <= s 的长度 <= 100000<=s的长度<=10000解法一:StringBuilder思路:使用 StringBuilder sb 来存放 新结果;若 s[i] 为空格,则将 “%20” 插入到 sb 中;否则,则将 s[i] 插入 sb 中class Solution { publ原创 2021-12-03 11:13:54 · 148 阅读 · 0 评论 -
《剑指offer》 -day4-查找算法(简单)--【二分专题】
剑指 Offer 03. 数组中重复的数字题目描述找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。限制:2<=n<=1000002 <= n <= 1000002<=n<=100000哈希Map思路:使用Map统计nums中每个元素的个数,取 次数大于1的,即可。简单,但是带来很多不必原创 2021-12-04 13:11:29 · 1013 阅读 · 1 评论 -
《剑指offer》 -day5-查找算法(中等)【二分】
剑指 Offer 04. 二维数组中的查找暴力思路:一个一个找,效率低。class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix.length == 0) return false; int n = matrix.length; int m = matrix[0].length; for (int i =原创 2021-12-05 22:20:41 · 835 阅读 · 0 评论 -
《剑指offer》 -day6- 搜索与回溯算法(简单)
剑指 Offer 32 - I. 从上到下打印二叉树题目描述从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。BFS-层次遍历思路:使用 BFS 实现层次遍历,需要借助 队列。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x原创 2021-12-06 21:46:23 · 353 阅读 · 0 评论 -
《剑指offer》 -day7-搜索与回溯算法(简单)
剑指 Offer 26. 树的子结构剑指 Offer 27. 二叉树的镜像递归写法一:不带返回值第一种递归的写法比较直观,但是需要单独定义一个 不带返回值的函数 void dfs(root)思路:每次遍历时,交换当前节点的左、右孩子节点遍历二叉树的方式可以采用 前序、后序、层次遍历,但是不能使用中序遍历。这里采用的是“前序”/** * Definition for a binary tree node. * public class TreeNode { * int原创 2022-04-07 22:29:11 · 552 阅读 · 0 评论 -
《剑指offer》 -day8 动态规划(简单)
剑指 Offer 10- I. 斐波那契数列题目描述写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。dp思路:简单dp原创 2021-12-08 22:20:42 · 105 阅读 · 0 评论 -
《剑指offer》 -day9- 动态规划(中等)
剑指 Offer 42. 连续子数组的最大和题目描述输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)O(n)O(n)。提示:1<=arr.length<=1051 <= arr.length <= 10^51<=arr.length<=105100<=arr[i]<=100100 <= arr[i] <= 100100<=arr[i]<=100dp原创 2021-12-09 12:18:38 · 453 阅读 · 0 评论 -
《剑指offer》 -day10- 动态规划(中等)
剑指 Offer 46. 把数字翻译成字符串题目描述给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。提示:0<=num<2310 <= num < 2^{31}0<=num<231DFS题目中说了 0<=num<2310 <= num < 2^{3原创 2021-12-10 23:04:02 · 399 阅读 · 0 评论 -
《剑指offer》 -day11- 双指针(简单)
剑指 Offer 18. 删除链表的节点题目描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。说明:题目保证链表中节点的值互不相同若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点暴力思路:题目保证链表中节点的值互不相同,所以只有一个node值为val。即,只用从前向后遍历找到值为 val 的 前驱节点,即可。Note:被删除的节点可能是头结点,所以这里引入 “虚拟头结点”(统一删除操作)。/原创 2021-12-11 11:04:31 · 598 阅读 · 1 评论 -
《剑指offer》 -day12- 双指针(简单)
剑指 Offer 25. 合并两个排序的链表题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。限制:0<=链表长度<=10000 <= 链表长度 <= 10000<=链表长度<=1000双指针思路:采用归并排序思想:分别采用两个指向链表 l1l1l1 和 l2l2l2 待处理节点的指针,每次比较两个待处理节点的 valvalval,将较小者添加到 新链表中。/** * Definition for singl原创 2021-12-12 10:48:19 · 707 阅读 · 0 评论 -
《剑指offer》 -day13- 双指针(简单)
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。提示:0<=nums.length<=500000 <= nums.length <= 500000<=nums.length<=500000<=nums[i]<=100000 <= nums[i] <= 100000<=nums[i]<=1000原创 2021-12-13 12:34:44 · 162 阅读 · 0 评论 -
《剑指offer》 -day14- 搜索与回溯算法(中等)【DFS】
剑指 Offer 12. 矩阵中的路径DFS思路 🤔遍历矩阵中所有元素:若矩阵中当前元素 board[i][j] 和 word.charAt(0) 相等时,尝试使用 dfs 进行判断由于是只有找到一个符合条件的,即可。满足条件时,则可以直接返回,所以可以将 dfs 设置为带有返回值 boolean dfs(StringBuilder cnt, int x, int y, int index);每次 dfs 判断当前位置 (x, y) 上、下、左、右 四个方法对应的新位置 (xx, yy)原创 2022-04-14 20:28:43 · 329 阅读 · 0 评论 -
《剑指offer》 -day15- 搜索与回溯算法(中等)【DFS】
剑指 Offer 36. 二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。dfs中序 线索化思路:剑指 Offer 34. 二叉树中和为某一值的路径题目描述给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。提示:树中节点总数在范围 [0, 5000] 内−10原创 2021-12-17 10:35:15 · 958 阅读 · 0 评论 -
《剑指offer》 -day16- 排序(简单)
剑指 Offer 61. 扑克牌中的顺子题目描述从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。限制:数组长度为 5数组的数取值为 [0, 13] .Set思路:统计numsnumsnums中的maxmaxmax和minminmin若极差max−minmax - minmax−min大于等于5,不可能构成顺子使用 setsetset原创 2021-12-16 22:24:23 · 138 阅读 · 0 评论 -
《剑指offer》 -day17- 排序(中等)-【堆/优先队列】
剑指 Offer 40. 最小的k个数题目描述输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。限制:0<=k<=arr.length<=100000 <= k <= arr.length <= 100000<=k<=arr.length<=100000<=arr[i]<=100000 <= arr[i] <= 100000<原创 2021-12-17 12:59:04 · 157 阅读 · 0 评论 -
《剑指offer》 -day18- 搜索与回溯算法(中等)【DFS】
剑指 Offer 55 - I. 二叉树的深度题目描述输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。提示:节点总数 <= 10000dfs思路:需要遍历整个树,并且需要对 左、右 子树的结果 进行逻辑判断,所以 需要使用 后序遍历/** * Definition for a binary tree node. * public class TreeNode { * int va原创 2021-12-19 11:53:59 · 116 阅读 · 0 评论 -
《剑指offer》 -day19- 搜索与回溯算法(中等)【DFS】
剑指 Offer 64. 求1+2+…+n题目描述求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。限制:1<=n<=100001 <= n <= 100001<=n<=10000递归这题可真是有点奇葩,第一反应是想到 暴力for、等差数列求和。但是,再一看发现题目中不让用 for和乘除法。于是想用递归来写,但是 题目又不让用 if,所以如下递归写法 也行不通原创 2021-12-20 10:36:11 · 575 阅读 · 0 评论 -
《剑指offer》-day 20 分治算法(中等)【分治 & 快速幂】
剑指 Offer 07. 重建二叉树DFS(分治)思路需要构建树,所以需要用 root.left、root.right “接住” 下层递归返回结果,所以需要递归返回值递归函数设计为:// 均为左闭右闭区间TreeNode build(int preorderStartIndex, int preorderEndIndex, int inorderStartIndex, int inorderEndIndex)终止条件:如果当前子数组为空,即 n < 0,则 return原创 2022-04-21 13:12:22 · 700 阅读 · 0 评论 -
《剑指offer》 -day21- 位运算(简单)
剑指 Offer 15. 二进制中1的个数题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用 二进制补码 记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号原创 2021-12-22 09:36:08 · 157 阅读 · 0 评论 -
《剑指offer》 -day22- 位运算(中等)
剑指 Offer 56 - I. 数组中数字出现的次数题目描述一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。限制:2<=nums.length<=100002 <= nums.length <= 100002<=nums.length<=10000哈希表思路:比较简单的思路是利用 map 统计每个元素出现的次数,然后取次数只出现一次的元素,即可。原创 2021-12-22 10:30:25 · 260 阅读 · 0 评论 -
《剑指offer》 -day23- 数学(简单)
剑指 Offer 39. 数组中出现次数超过一半的数字题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。限制:1 <= 数组长度 <= 50000这题和 leetcode-229. 求众数 II 一样。哈希思路:统计每个元素的出现次数,找次数超过 n/2n/2n/2 的元素。class Solution { public int majorityElement(int[] n原创 2021-12-23 13:05:41 · 622 阅读 · 0 评论 -
《剑指offer》-day 24 -数学(中等)
剑指 Offer 14- I. 剪绳子提示:2<=n<=582 <= n <= 582<=n<=58注意:本题与 343. 整数拆分 题相同DFS (TLE)class Solution { int n; int res = 0; public int cuttingRope(int n) { this.n = n; dfs(0, 1, new ArrayList<>());原创 2022-04-25 13:35:26 · 661 阅读 · 0 评论 -
《剑指offer》 -day25 -模拟(中等)
剑指 Offer 29. 顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。限制:0<=matrix.length<=1000 <= matrix.length <= 1000<=matrix.length<=1000<=matrix[i].length<=1000 <= matrix[i].length <= 1000<=matrix[i].length<=100...原创 2021-12-27 22:41:06 · 86 阅读 · 0 评论 -
《剑指offer》-day 27 栈与队列(困难)【单调队列】
剑指 Offer 59 - I. 滑动窗口的最大值单调队列参考:单调队列-leetcode- 239. 滑动窗口最大值思路 🤔维护一个队列,其单调性为“从队头到队尾单调减”,可对其操作如下:add(int val):若当前元素 valvalval > 队尾元素,则需要维护单调性,即队尾出队,直至满足单调性为止(从队头到队尾单调减);否则,则将当前元素 valvalval 直接插入队尾,即可remove(int val):若当前元素 valvalval == 队头元素,则将队头元素出原创 2022-04-30 21:28:13 · 509 阅读 · 0 评论