Leetcode
待别三日
这个作者很懒,什么都没留下…
展开
-
【leetcode】剑指 Offer 10- II. 青蛙跳台阶问题
题目描述题目连接剑指 Offer 10- II. 青蛙跳台阶问题题解此题跟斐波那契数列一样,利用动态规划的思想。dp[n]的意义,上第n级台阶有多少种方法设置初值dp[0] = 1, dp[1] = 1递推公式:因为一次能上一级台阶或者两级台阶。所以dp[n] = dp[n - 1] + dp[n - 2]因为dp[n]只与前两个数字有关,可以进行空间优化class Solution { public int numWays(int n) { if (n <原创 2021-12-28 14:14:25 · 235 阅读 · 0 评论 -
【leetcode】剑指 Offer 04. 二维数组中的查找
题目描述题目连接剑指 Offer 04. 二维数组中的查找题解仔细观察矩阵规律。我们可以从左上角开始对比。从左上角开始对比,cur如果target比当前值大,cur下移如果target比当前值小,cur左移越过边界则返回falseclass Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix.length == 0) return false原创 2021-12-28 14:08:31 · 3094 阅读 · 0 评论 -
【leetcode】剑指 Offer 03. 数组中重复的数字
题目描述题目连接剑指 Offer 03. 数组中重复的数字题解归位法,长度为n,并且所有数字都是在0到n-1之间。长度为n,并且所有数字都是在0到n-1之间。我们把所有的的数字进行归位。比如当nums[i] == 1的时候,我们把它放在第1个位置,当nums[i] == 2的时候,我们把它放在第2个位置…详见代码注释。class Solution { public int findRepeatNumber(int[] nums) { //遍历nums中每个数字原创 2021-12-28 14:00:25 · 3089 阅读 · 0 评论 -
【leetcode】剑指 Offer 09. 用两个栈实现队列
题目描述题目连接剑指 Offer 09. 用两个栈实现队列题解队列是先进先出的。栈是先进后出的,也就是说可以用栈实现反序。那么我们就可以用两个栈,实现两次反序,就变成先进先出的了。创建两个栈,s1负责入栈,s2负责出栈入栈时,直接加入s1栈顶出栈时,如果s2不为空的话,直接输出s2栈顶。如果s2为空的话,把s1中的元素都加入到s2之中,再输出。class CQueue { Deque<Integer> s1; Deque<Integer> s2;原创 2021-12-28 13:47:38 · 87 阅读 · 0 评论 -
【leetcode】剑指 Offer 10- I. 斐波那契数列
题目描述题目连接:剑指 Offer 10- I. 斐波那契数列题解:动态规划思想初值:f0 = 0, f1 = 1递推公式:f (n) = f (n - 1) + f (n - 2)由于f (n)只和前两个有关,所以可以利用三个变量来进行空间优化class Solution { public int fib(int n) { if (n <= 1) return n; int a = 0, b = 1, c = 0; for原创 2021-12-28 13:35:39 · 270 阅读 · 0 评论 -
【leetcode】122. 买卖股票的时机 II(Java)
题目描述题目连接122. 买卖股票的最佳时机 II题解贪心,动态规划1、贪心只要今天的价格比昨天的高,那我就赚钱了!class Solution { public int maxProfit(int[] prices) { int res = 0; for (int i = 1; i < prices.length; i++){ if (prices[i] - prices[i - 1] > 0){原创 2021-11-15 20:48:31 · 260 阅读 · 0 评论 -
【leetcode】24. 两两交换链表中的节点(Java)
题目描述题目连接24. 两两交换链表中的节点题解链表题舍得用指针就好首先建个哑节点res。 res.next = head;要交换两个相邻节点,需要保存3个指针,1、前驱节点pre;2、第一个要交换的节点slow; 3、第二个要交换的节点fast。交换过程如下: pre.next = fast; slow.next = fast.next; fast.next = slow;更新pre,交换下一组详见代码注释class Sol原创 2021-11-15 20:37:19 · 588 阅读 · 0 评论 -
【leetcode】169. 多数元素(Java)
题目描述题目连接169. 多数元素题解摩尔投票法:class Solution { public int majorityElement(int[] nums) { int res = nums[0]; int count = 1; for (int i = 1; i < nums.length; i++){ if (nums[i] == res){ count++;原创 2021-11-15 20:20:14 · 75 阅读 · 0 评论 -
【leetcode】剑指 Offer 40. 最小的k个数(Java)
题目描述题目连接剑指 Offer 40. 最小的k个数题解快速排序:我们知道快速排序的每一轮,都是找到一个数应该在的位置,左边都是比他小的,右边都是比他大的。所以我们进行快排,当当前坐标等于k - 1的时候,左边的数组就是前k小的数class Solution { public int[] getLeastNumbers(int[] arr, int k) { return quick(arr, k, 0, arr.length - 1); } publ原创 2021-11-15 20:18:21 · 438 阅读 · 0 评论 -
【leetcode】72. 编辑距离(Java)
题目描述题目连接72. 编辑距离题解经典dp:dp数组定义:dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。初始化:dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2的最近编辑距离为dp[i][0]。所以直接初始化为非空串的长度即可for (int i = 1; i <= c1.length; i++){ dp[i][0] = i; } for原创 2021-11-12 20:54:19 · 253 阅读 · 0 评论 -
【leetcode】剑指 Offer 54. 二叉搜索树的第k大节点(Java)
题目描述题目连接剑指 Offer 54. 二叉搜索树的第k大节点题解中序遍历:二叉搜索树中序遍历是从小到大。先遍历右子树,再遍历左子树,就变成从大到小了。用target计数,target等于0时,就是我们要找的第K大节点class Solution { int res = 0; int target = 0; public int kthLargest(TreeNode root, int k) { target = k; dfs(root原创 2021-11-12 19:50:30 · 349 阅读 · 0 评论 -
【leetcode】226. 翻转二叉树(Java)
题目描述题目连接226. 翻转二叉树题解后序遍历:后序遍历,交换左右子树即可class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) return root; TreeNode left = invertTree(root.left); TreeNode right = invertTree(root.right); root原创 2021-11-11 19:55:23 · 531 阅读 · 0 评论 -
【leetcode】剑指 Offer 36. 二叉搜索树与双向链表(Java)
题目描述题目链接剑指 Offer 36. 二叉搜索树与双向链表题解中序遍历:pre记录前一个节点,cur记录当前节点当pre != null 时, pre.right = cur , cur.left = pre我们还需要记录头节点和尾节点,把链表变成循环链表当pre == null的时候,当前cur就是头节点当遍历结束时, pre所指向的就是最后一个节点,直接连接就可以,详见代码注释class Solution { Node cur = null; Node pre原创 2021-11-11 19:52:38 · 599 阅读 · 0 评论 -
【leetcode】83. 删除排序链表中的重复元素(Java)
题目描述题目链接83. 删除排序链表中的重复元素题解cur记录当前节点,tmp往下找到第一个不等于cur.val的节点。直接cur.next = tmp,就把中间相同的都删除掉了class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == null) return head; ListNode cur = head, tmp = head; whi原创 2021-11-11 19:46:04 · 233 阅读 · 0 评论 -
【leetcode】48. 旋转图像(Java)
题目描述题目链接48. 旋转图像题解先上下旋转,再按照对角线旋转class Solution { public void rotate(int[][] matrix) { //上下旋转 //7 8 9 //4 5 6 //1 2 3 for (int i = 0; i < matrix.length / 2; i++){ for (int j = 0; j < matrix[0].length; j原创 2021-11-11 19:41:57 · 394 阅读 · 0 评论 -
【leetcode】138. 复制带随机指针的链表(Java)
题目描述题目链接138. 复制带随机指针的链表题解哈希表:key是原始节点,value是复制的节点。思路挺简单的,直接看代码就能理解了class Solution { public Node copyRandomList(Node head) { Map<Node, Node> map = new HashMap<>(); Node cur = head; while (cur != null){原创 2021-11-10 21:21:41 · 70 阅读 · 0 评论 -
【leetcode】221. 最大正方形(Java)
题目描述题目链接221. 最大正方形题解动态规划:dp数组的含义:以当前节点为右下角的正方形的 边长递推公式:dp[i][j] = min(左边、上边、左上方)+ 1dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;完整代码:class Solution { public int maximalSquare(char[][] matrix) { int原创 2021-11-10 21:18:04 · 280 阅读 · 0 评论 -
【leetcode】958. 二叉树的完全性检验(Java)
题目描述题目链接958. 二叉树的完全性检验题解层次遍历:层次遍历,空值也入队,当出队值为空时判断队列剩下元素是否都为空,为则完全二叉树class Solution { public boolean isCompleteTree(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isE原创 2021-11-10 21:12:53 · 259 阅读 · 0 评论 -
【leetcode】22. 括号生成(Java)
题目描述题目链接22. 括号生成题解回溯:用left, right分别记录左括号和右括号的数量终止条件:path.length() == n * 2 && left == n && right == n的时候,满足条件,保存结果( path记录当前的路径)right > left || left > n || right > n 此时括号是无效的,直接return处理逻辑:左子树递归: path后面加一个’(’,left + 1原创 2021-11-10 00:17:34 · 155 阅读 · 0 评论 -
【leetcode】129. 求根节点到叶节点数字之和(Java)
题目描述题目链接129. 求根节点到叶节点数字之和题解递归:终止条件:当遇到叶子节点的时候,返回当前路径组合的值当遇到空节点的时候,返回0( 一定要返回0)处理逻辑:用target记录从根节点到当前节点的值,并作为参数传入下一个递归函数如果不为空的话,target = target * 10 + root.valclass Solution { public int sumNumbers(TreeNode root) { return dfs(ro原创 2021-11-10 00:06:45 · 101 阅读 · 0 评论 -
【leetcode】104. 二叉树的最大深度(Java)
题目描述题目链接104. 二叉树的最大深度题解递归:终止条件:root == null return 0处理逻辑:递归处理左子树右子树,返回其中大的,并且 +1。class Solution { public int maxDepth(TreeNode root) { return getDepth(root); } public int getDepth(TreeNode root){ if (root == null) retur原创 2021-11-10 00:00:09 · 380 阅读 · 0 评论 -
【leetcode】70. 爬楼梯(Java)
题目描述题目链接70. 爬楼梯题解动态规划:dp[i]含义:上第i层楼梯,有几种方法递推公式:上第i层楼梯,可以从i - 1,上1层,或者从i - 2,上2层。所以递推公式:dp[i] = dp[i - 1] + dp[i - 2]class Solution { public int climbStairs(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1;原创 2021-11-09 23:56:07 · 64 阅读 · 0 评论 -
【leetcode】110. 平衡二叉树(Java)
题目描述题目链接110. 平衡二叉树题解自顶向下(暴力):求左子树的深度,右子树的深度,两个深度相减,如果绝对值小于1,递归判断左子树,右子树class Solution { public boolean isBalanced(TreeNode root) { if (root == null) return true; int left = getDepth(root.left); int right = getDepth(root.原创 2021-11-05 20:34:14 · 79 阅读 · 0 评论 -
【leetcode】101. 对称二叉树(Java)
题目描述题目链接101. 对称二叉树题解递归迭代都要会。递归:看根节点的左右子树是否对称,与根节点无关。递归终止条件:left == null && right == null处理逻辑: 注意我们要做的不是验证二叉树的左右子树是否相等! 而是是否镜像对称!所以我们递归的参数应该是check(left.left, right.right) && check(left.right, right.left)class Solution { public原创 2021-11-05 20:09:43 · 109 阅读 · 0 评论 -
【leetcode】239. 滑动窗口最大值(Java)
题目描述题目链接239. 滑动窗口最大值题解维护双端单调递减队列:维护一个单调递减队列,队列头部元素,就是此时滑动窗口中的最大值,队列中只存放可能是最大值的数,若新入队列的值x,大于队列中的部分值,依次弹出这些值,入队新值。因为,滑动窗口其实也可以看作一个先进先出的队列,x是最后一个入队的,只要有x在,那么比他小的数,就必不可能成为最大值。所以要把它们弹出去。举个例子:2 4 3。 滑动窗口大小为2。遍历到2, 2入队。遍历到4, 发现4比2大,所以弹出2。因为4一定是比2后出滑动窗原创 2021-11-03 23:05:18 · 119 阅读 · 0 评论 -
【leetcode】32. 最长有效括号(Java)
题目描述题目链接32. 最长有效括号题解动态规划dp[i]的含义:以当前字符为结尾的 最长有效括号字串的长度dp初始化:有效括号长度肯定是成双成对的,所以dp[0] = 0。dp递推公式:如果dp[i] == '(',那么一个有效括号串,不可能以’('结尾,所以如果dp[i] == '(',dp[i] = 0。如果dp[i] == ')',此时的情况就有些复杂了,遇到右括号,我们肯定要查找前面有没有和它匹配的左括号,但是这个左括号应该去哪查找呢?我们举一个例子来看。(())遍历原创 2021-11-03 22:29:13 · 130 阅读 · 0 评论 -
【leetcode】113. 路径总和 II(Java)
题目描述题目链接113. 路径总和 II题解经典回溯。终止条件: 当遍历到叶子节点,并且此时路径的值 == targerSum,此时收集当前的path。处理逻辑:我们遍历到一个节点时,可以把targetSum - root.val作为下一层的targetSum,所以当我们找到叶子节点的时候,并且root.val == targetSum,就可以收集了。完整代码class Solution { List<List<Integer>> res = new Ar原创 2021-11-03 21:57:57 · 151 阅读 · 0 评论 -
【leetcode】543. 二叉树的直径(Java)
题目描述题目链接543. 二叉树的直径题解每遇到一个节点,都求一下左子树的最大深度left,和右子树的最大深度right。此时经过当前节点的最大直径,就是left + right,与res比较更新即可。class Solution { int res = 0; public int diameterOfBinaryTree(TreeNode root) { getDepth(root); return res; } public i原创 2021-11-03 21:53:14 · 106 阅读 · 0 评论 -
【leetcode】155. 最小栈(Java)
题目描述题目链接155. 最小栈题解辅助栈方法。一个栈deque,存放数据,一个栈min,存放当前的最小值入栈的时候,如果要入栈的数x,小于等于min的栈顶元素m,就同时压入min和deque,否则直接压入deque。(要是x大于m的话,由于m是比x先入栈,所以m一定在x之后出栈,那么x就永远也不会成为最小值,所以min中不需要添加x)出栈的时候,要判断出栈的元素和min的栈顶元素是不是相等,如果相等同时出栈。注意:如果栈定义为Deque<Integer>的话,判断相等要用eq原创 2021-11-03 21:47:05 · 134 阅读 · 0 评论 -
【leetcode】151. 翻转字符串里的单词(Java)
题目描述题目链接151. 翻转字符串里的单词题解不用库函数,一次遍历实现反转。分析一下题目: 反转字符串里面的单词,我们可以从后向前遍历,找到最后一个单词,添加到结果,再找到倒数第二个单词,添加到结果…具体实现:用left和right标记一个单词的左右边界。首先从后向前移动left,当遇到空格的时候,直接左移。直到移动到第一个不为空格的字符,此时就是最后一个单词的右边界。right == left然后继续前移left,找到下一个空格,此时s.substring(left + 1, ri原创 2021-11-03 21:25:47 · 213 阅读 · 0 评论 -
【leetcode】78. 子集(Java)
题目描述题目链接78. 子集题解回溯法做回溯算法的时候我们可以先画一个树。所有的回溯算法,都可以看作一棵树从根节点向下遍历的过程。我们以nums = [1,2,3]为例,此题的回溯所对应的树就应该如下。接下里我们观察要收集什么: 要收集全部的子集,也就说每到了一个节点,都要进行收集。再观察递归处理的过程:观察第一层,分别为1、2、3,也就是说第一层要从nums[0]开始遍历到结尾。观察1节点下的第二层,是2,3 (2节点下的第二层,是3)。 也就是说第二层要从nums[1]遍历到结尾原创 2021-11-03 21:08:11 · 169 阅读 · 0 评论 -
【leetcode】470. 用 Rand7() 实现 Rand10()(Java)
题目描述题目链接470. 用 Rand7() 实现 Rand10()题解这个题解写的特别详细class Solution extends SolBase { public int rand10() { while (true){ int num = (rand7() - 1) * 7 + rand7(); if (num <= 40){ return 1 + num % 10;原创 2021-11-02 23:01:28 · 75 阅读 · 0 评论 -
【leetcode】41. 缺失的第一个正数(Java)
题目描述题目链接41. 缺失的第一个正数题解归位法,我们把所有的1 <= nums[i] <= nums.length的数字进行归位。比如当nums[i] == 1的时候,我们把它放在第0个位置,当nums[i] == 2的时候,我们把它放在第1个位置…举个例子[3,4,-1,1],归位之后为[1,4,3,-1],其中数字1和3,分别都归位到了第0个位置和第2个位置。然后遍历归位后的数组,当nums[i] != i + 1的时候,i + 1就是缺失的第一个整数如果遍历结束,则返原创 2021-11-02 22:55:32 · 241 阅读 · 0 评论 -
【leetcode】105. 从前序与中序遍历序列构造二叉树(Java)
题目描述题目链接105. 从前序与中序遍历序列构造二叉树题解分治法,注意边界处理,可以举两个数,往里面套一下class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1); } public TreeNode b原创 2021-11-02 22:35:15 · 52 阅读 · 0 评论 -
【leetcode】98. 验证二叉搜索树(Java)
题目描述题目链接98. 验证二叉搜索树题解遇到二叉搜索树,一定要想到二叉搜索树的中序遍历是递增序列!所以我们验证是否为二叉搜索树的话,只要看它中序遍历的结果是不是递增的就可以了。我们用pre指针记录前一个节点,如果当前节点小于等于前一个节点,就返回falseclass Solution { TreeNode pre = null; public boolean isValidBST(TreeNode root) { if (root == null) {原创 2021-11-02 22:30:20 · 138 阅读 · 0 评论 -
【leetcode】93. 复原 IP 地址(Java)
题目描述题目链接93. 复原 IP 地址题解回溯法我们的目的就是在这一个字符串中插入三个点,然后使每一段都在[0, 255]之间。回溯终止条件:当插入的点为3个,并且最后一段在[0, 255]之间。处理逻辑,当这一段有效的时候,在后面插入一个点,递归处理后面的字符串。详见代码注释class Solution { List<String> res = new ArrayList<>(); StringBuffer path = new StringB原创 2021-11-01 20:59:49 · 294 阅读 · 0 评论 -
【leetcode】56. 合并区间(Java)
题目描述题目链接56. 合并区间题解首先把数组排序,先按照起点升序排列,如果起点位置相同,按照结尾升序排序。设置start 和 end 为当前区间的开始和结尾。遍历intervals,如果下一个的起点大于当前区间的结尾,那么就说明这两个区间有重叠,要进行合并,所以要更新结尾,end = Math.max(end, intervals[i + 1][1])如果下一个的起点,小于当前区间的结尾,说明这两个区间没有重叠。之前start,end是一个单独的区间,所以保存起来。保存之后,重新设置str原创 2021-11-01 20:19:50 · 461 阅读 · 0 评论 -
【leetcode】145. 二叉树的后序遍历(Java)
题目描述题目链接145. 二叉树的后序遍历题解迭代法:后续遍历是左右中,我们可以利用前序遍历的方法,遍历中右左,然后把结果反过来即可class Solution { public List<Integer> postorderTraversal(TreeNode root) { LinkedList<Integer> res = new LinkedList<>(); Deque<TreeNode> deque原创 2021-11-01 19:32:06 · 66 阅读 · 0 评论 -
【leetcode】94. 二叉树的中序遍历(Java)
题目描述题目链接94. 二叉树的中序遍历题解迭代:class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); Deque<TreeNode> deque = new LinkedList<>(); while (root !原创 2021-11-01 19:29:32 · 66 阅读 · 0 评论 -
【leetcode】144. 二叉树的前序遍历(Java)
题目描述题目链接144. 二叉树的前序遍历题解递归:class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if (root == null) return res; dfs(root); return res; }原创 2021-11-01 19:25:13 · 114 阅读 · 0 评论