![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
零一熊
这个作者很懒,什么都没留下…
展开
-
LeetCode 103. 二叉树的锯齿形层序遍历
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。BFS+双端队列class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); List<List<Inte原创 2021-07-28 02:18:55 · 262 阅读 · 0 评论 -
LeetCode 剑指 Offer 45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。定制排序+快排x + y < y + x 则 x < y(字符串拼接)class Solution { public String minNumber(int[] nums) { String[] strs = new String[nums.length]; for(int i = 0; i < nums.length; i++)原创 2021-07-13 21:57:47 · 159 阅读 · 0 评论 -
LeetCode 剑指 Offer 46. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。动态规划dp[i] 代表到当前字符有多少种翻译数当第i位字符和第i - 1位字符可以翻译成字符串时,dp[i] = dp[i - 1] + dp[i - 2]反之dp[i] = dp[i - 1]class Solution { public int transl原创 2021-07-13 21:47:43 · 67 阅读 · 0 评论 -
LeetCode 剑指 Offer 44. 数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。找规律先确定所在数字是几位数然后确定在该位数区间的第几个数最后确实是这个数的第几位class Solution { public int findNthDigit(int n) { int digit = 1; long start = 1;原创 2021-07-06 19:52:56 · 62 阅读 · 0 评论 -
LeetCode 剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。摩尔投票维护候选众数class Solution { public int majorityElement(int[] nums) { int num = 0, votes = 0; for(int n : nums){ if(votes == 0) num = n;原创 2021-07-06 18:55:10 · 52 阅读 · 0 评论 -
LeetCode 剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。dfs + 剪枝dfs每一位字符的所有情况,通过和后面的字符交换实现用set去除当前位字符与待交换字符可能的重复class Solution { char[] c; List<String> res; public String[] permutation(String s) { c = s.toCharArray(); re原创 2021-07-04 21:34:57 · 51 阅读 · 0 评论 -
LeetCode 剑指 Offer 36. 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向中序遍历满足递增顺序用一个额外的pre变量记录前一个节点class Solution { Node pre, head; public Node treeToDoublyList(Node root) { if(root == null) return null; inOrder(root); hea原创 2021-07-04 20:44:19 · 44 阅读 · 0 评论 -
LeetCode 剑指 Offer 34. 二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。DFS遍历在遍历过程中记录路径上的节点值并将target减去当前节点当到叶子节点且target为0时 加入答案集合中注意在递归之后要删掉对应节点 保持递归前后的一致性class Solution { List<List<Integer>> results; List<Integer> result; publi原创 2021-07-02 21:50:33 · 142 阅读 · 2 评论 -
BFPRT算法
在partition的基础上对选择划分点的优化,将不确定的随机划分转化为可以确定的范围,进而确定了O(N)的时间复杂度在bfprt算法中,pivot点的求法:1.将数组划分为五个一组2.求出每组的中位数3.在由中位数组成的数组中,求出其中位数作为pivot点在此pivot点的划分下,可以确定小于pivot点的数至多有几个,通过大于pivot点的数至少有几个求得。方法:在中位数组成的数组中有n/10规模的数大于pivot点,而这n/10规模的数在自己的小组中又有2个数大于自己,所以共有至少3n/10原创 2021-07-01 21:09:00 · 76 阅读 · 0 评论 -
LeetCode 剑指 Offer 33. 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。方法一 递归判断从i到j范围上是否满足左孩子节点小于根 右孩子节点大于根递归左子树和右子树方法二 单调栈将后序遍历倒过来即为中右左的顺序单调递增栈用来维护右孩子节点若当前元素小于栈顶元素栈顶元素出栈并作为当前相对根节点则之后的元素应作为该相对节点的左孩子若大于当前相对根节点 则不满足条件class Solution { public原创 2021-07-01 19:52:14 · 43 阅读 · 0 评论 -
LeetCode 剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。利用队列实现按层遍历class Solution { public int[] levelOrder(TreeNode root) { if(root == null){ return new int[0]; } Queue<TreeNode> queue = new LinkedList<>(); List<I原创 2021-06-22 21:35:31 · 41 阅读 · 0 评论 -
LeetCode 剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。用压入和弹出序列模拟操作过程若最后栈为空 说明两个序列对应class Solution { public boolean validateStackSequences(int[] pushed, int[]原创 2021-06-22 21:25:59 · 120 阅读 · 0 评论 -
LeetCode 剑指 Offer 42. 连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。动态规划dp[i]代表以i结尾的最大子数组的和若dp[i - 1] > 0, dp[i] = dp[i - 1] + nums[i],否则 dp[i] = nums[i]class Solution { public int maxSubArray(int[] nums) { int[] dp = new int[2]; int res =原创 2021-06-21 19:27:52 · 84 阅读 · 0 评论 -
LeetCode 剑指 Offer 40. 最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。大根堆维护前k小当堆的大小比k大时 弹出堆顶元素class Solution { public int[] getLeastNumbers(int[] arr, int k) { PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<原创 2021-06-21 18:29:55 · 50 阅读 · 0 评论 -
LeetCode 剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。在原链表上进行复制后再拆分class Solution { public Node copyRandomList(Node head) { if(head == null){ return null; } Node cur = head;原创 2021-06-20 20:43:59 · 47 阅读 · 0 评论 -
LeetCode 剑指 Offer 18. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意被删除的节点可能是头节点class Solution { public ListNode deleteNode(ListNode head, int val) { ListNode cur = head; ListNode pre = null; if(head.val == val){ return head.next;原创 2021-06-20 20:21:06 · 42 阅读 · 0 评论 -
LeetCode 剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。class Solution { public ListNode reverseList(ListNode head) { if(head == null){ return null; } ListNode pre = null; ListNode cur = head; while(cur != null){原创 2021-06-20 20:16:55 · 50 阅读 · 0 评论 -
LeetCode 剑指 Offer 19. 正则表达式匹配
请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。动态规划当p为空时,当且仅当s为空,两字符串匹配当p不为空时,需要继续判断若p当前字符不为,当且仅当p当前字符匹配s当前字符或p当前字符为,两字符串可能匹配,且匹配结果为dp i-1 j-1若当前字符为*,有两种情况原创 2021-06-17 21:01:57 · 66 阅读 · 0 评论 -
LeetCode 剑指 Offer 17. 打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。通过字符串拼接,得到循环次数class Solution { public int[] printNumbers(int n) { StringBuilder sb = new StringBuilder(); while(n-- > 0){ sb.append("9"); }原创 2021-06-17 20:06:04 · 48 阅读 · 0 评论 -
LeetCode 剑指 Offer 16. 数值的整数次方
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。快速幂注意考虑n<0的情况class Solution { public double myPow(double x, int n) { double res = 1; if(n == 0){ return res; } if(n > 0){ while(n &g原创 2021-06-16 21:35:34 · 84 阅读 · 0 评论 -
LeetCode 剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。通过双指针求出链表的长度根据长度和k求出头结点要移动的距离再从头结点出发找到相应节点class Solution { public ListNode getKthFromEnd(ListNode head, int k) { if原创 2021-06-16 21:17:52 · 48 阅读 · 0 评论 -
LeetCode 剑指 Offer 29. 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。按层打印从最外层逐层向内层打印通过左上角的点和右上角的点来划分每一层从外层到下一层只需左上角点的横纵坐标+1 右下角点的横纵坐标-1class Solution { ArrayList<Integer> res; public int[] spiralOrder(int[][] matrix) { if(matrix == null || matrix.length == 0){原创 2021-06-16 20:50:07 · 62 阅读 · 0 评论 -
LeetCode 剑指 Offer 15. 二进制中1的个数
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。(~n + 1) & n即可得到n的最后一位1用这个1异或n 即可得到去掉最后一个1的n重复上述过程直到n去掉了所有的1public class Solution { // you need to treat n as an unsigned value public int hammingWeigh原创 2021-06-15 12:20:49 · 84 阅读 · 0 评论 -
LeetCode 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。双指针partition一个指针从0开始 一个指针从最后一个元素前指针遇到偶数停止 后指针遇到奇数停止交换两个指针的元素class Solution { public int[] exchange(int[] nums) { if(nums == null || nums.length == 0){ return new int[0];原创 2021-06-15 12:13:13 · 54 阅读 · 0 评论 -
LeetCode 剑指 Offer 27. 二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。递归class Solution { public TreeNode mirrorTree(TreeNode root) { if(root == null){ return null; } help(root); return root; } private void swap(TreeNode node){ TreeNod原创 2021-06-14 21:29:45 · 62 阅读 · 0 评论 -
LeetCode 剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。递归递归判断左子树的左孩子和右子树的右孩子 左子树的右孩子和右子树的左孩子class Solution { public boolean isSymmetric(TreeNode root) { return root == null ? true : help(root.left, root.right); } private boolean help(TreeNod原创 2021-06-14 21:28:19 · 61 阅读 · 0 评论 -
LeetCode 剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。递归当A根与B根相同时 递归判断A根左子树是否有和B根左子树相同的结构右侧同理当B为null时 说明之前的递归都符合条件 A已经满足了B 返回true若递归后发现A子树不能满足B子树 递归A的左子树是否满足B A的右子树是否满足Bclass Solution { public boolean isSubStructure(TreeNode A, Tre原创 2021-06-12 09:25:17 · 56 阅读 · 0 评论 -
LeetCode 剑指 Offer 25. 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。伪头结点class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(-1); ListNode cur = dummy; while(l1 != null && l2 != null){原创 2021-06-12 08:40:04 · 107 阅读 · 0 评论 -
LeetCode 剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。递归由于前序遍历的特性,相对的第一个结点即为当前树的根节点(可能为子树)通过构造hashmap的映射 找到中序遍历对应的结点位置即可得出当前根节点的左子树和右子树的大小得到当前根节点的左子树大小后 即可得出前序遍历下左子树的结点区间通过前序遍历左子树区间和中序遍历左子树区间递归求出根节点的左子树的根节点右子树同理class Solution { Map<Integer,原创 2021-06-10 21:44:44 · 120 阅读 · 0 评论 -
LeetCode 剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。利用递归保存数据在返回时添加到list中即可实现逆序class Solution { List<Integer> res = new ArrayList<>(); public int[] reversePrint(ListNode head) { // if(head == null){ // return new int[0]; //原创 2021-06-10 20:51:37 · 44 阅读 · 0 评论 -
LeetCode 剑指 Offer 13. 机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?dfs额外用一个二维数组记录当前点是否已经走过递归的定义为 当前点是否可以到达 若可以到达 在向右原创 2021-06-06 10:59:39 · 45 阅读 · 0 评论 -
LeetCode 剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。class Solution { public String replaceSpace(String s) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < s.length(); i++){ if(s.charAt(i) == ' '){ sb.append("%20");原创 2021-06-06 09:34:53 · 43 阅读 · 0 评论 -
LeetCode 剑指 Offer 12. 矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。dfs+剪枝若当前下标越界或当前矩阵元素与对应字符串元素不相同直接返回false 无需后续遍历class Solution { public boolean exist(char[][] board,原创 2021-06-06 09:26:34 · 100 阅读 · 0 评论 -
LeetCode 剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。二分法class Solution { public int minArray(int[] numbers) { int l = 0, r = numbers.length - 1; while(l + 1 < r){原创 2021-06-05 11:50:56 · 86 阅读 · 0 评论 -
LeetCode 剑指 Offer 10- II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。dp 第i项只和第i-1项,i-2项有关,可以优化空间class Solution { // int[] help = new int[101]; public int numWays(int n) { // if(n == 0) // return原创 2021-06-05 10:51:14 · 53 阅读 · 0 评论 -
LeetCode 剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。数组行列递增 即从左上到右下整体递增从右上角开始 往左移动可选元素范围一定减小 往下移动一定增加若当前元素大于target向左走 小于target向下走class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target原创 2021-06-05 10:21:28 · 42 阅读 · 0 评论 -
LeetCode 剑指 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。纯递归会有重复计算 会超时用数组记录已经计算过的值 若某个位置的值不为0 可以直接用原创 2021-06-04 11:41:44 · 78 阅读 · 0 评论 -
LeetCode 剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。由于数组长度大于数组中的最大数字所以可以通过将每个数字放到它的值所对应的索引位置来记录某个数字是否出现过若判断当前数字未处在正确索引位置并且与正确索引位置的值相同 即重复数字class Solution { public int findRepeatNumber(int[] nums)原创 2021-06-04 11:36:49 · 48 阅读 · 0 评论 -
LeetCode 剑指 Offer 58 - I. 翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。同向双指针前指针从字符串末尾向前走,当遇到非空格字符,继续向前直到遇到空格,拼接到StringBuilder中当遇到下一个非空格字符 将后指针移动到前指针的位置class Solution { public String reverseWords(String s) { // S原创 2021-06-03 20:23:24 · 92 阅读 · 0 评论 -
LeetCode 1498.满足条件的子序列
给你一个整数数组 nums 和一个整数 target 。请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。由于答案可能很大,请将结果对 10^9 + 7 取余后返回。先对数组进行排序 枚举可能子序列的最小值用二分法找到满足条件的最大值2的(最大值-最小值)次幂为当前最小值可能的子序列数目预处理数组 求出2的对应次幂取余class Solution { static final int P = 1000000007;原创 2021-05-21 18:13:59 · 87 阅读 · 0 评论