Leetcode
「已注销」
这个作者很懒,什么都没留下…
展开
-
416. 分割等和子集
0-1背包问题,在数组中找出和为sum/2的元素。动态规划,那么需要利用之前的计算结果,关键就是这一步。那么就是设计dp数组的难度,dp数组的设计很巧妙dp[i][j]表示在[0,i],和为j是否存在。那么这样就能推导出动态转移方程dp[i][j] = dp[i-1][j] | dp[i-1] [j-nums[i]]但是初始化怎么做,已经计算出target,那么数组中最大的数就只能是targetif (nums[0] < target) { dp[0][nums[.原创 2021-04-03 11:33:32 · 133 阅读 · 0 评论 -
279.完全平方数
这道题肯定是用动态规划,动态方程如何找?两个for循环这个好像在之前没有遇到过,其实对于题目的意思可以思考出,要找个数最小,那么就需要最小的非完全平方数加上一个最大的完全平方数,然后再区寻找这个最小的非完全平方数的个数。这是其一,其二,由于个数不确定,并且要求个数最少的,那么是必须要枚举class Solution { public int numSquares(int n) { int[] dp = new int[n + 1]; for (int i = 1.原创 2021-02-21 11:26:04 · 83 阅读 · 0 评论 -
239. 滑动窗口最大值
这道题一开始的思路便是动态规划,但是有一个问题,那就是如何利用前一个dp结果,不知道,前一个叫结果必定是k长度的结果,所以这个不能用动态规划。然后看了下讨论区,使用双向队列。双向队列,head处维持当前最大值,尾部加入的元素一定维持是最大的。class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int len = nums.length; Deque<Integer>.原创 2021-02-21 11:17:07 · 81 阅读 · 0 评论 -
240. 搜索二维矩阵 II
这道题一开始的不明白题意,看完解答才知道这题要干什么=_= , 就是在矩阵中找target,最简单的方法是暴力破解。第二种方法,是从左下角或者左上角开始寻找,减枝class Solution { public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length, n = matrix[0].length; int i = 0, j = n - 1; .原创 2021-02-20 09:19:44 · 89 阅读 · 0 评论 -
448. 找到所有数组中消失的数字
思路和41题一样,直接将原数组的角标作为数的值,然后将出现的变成负数。class Solution { public List<Integer> findDisappearedNumbers(int[] nums) { for (int i = 0; i < nums.length; i++) { int tmp = Math.abs(nums[i]); if (nums[tmp - 1] > 0) .原创 2021-02-20 09:19:13 · 90 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
这道题的第一个想法便是动态规划,但是在找动态方程的时候有点问题,觉得是j*dp[i-j]这样,但是漏了一点——j*(i-j),并且还要从1~i-1这中间找class Solution { public int cuttingRope(int n) { int[] nums = new int[n+1]; nums[1] = 0; for(int i = 2; i <= n; i++){ int max = 0; .原创 2021-02-19 23:54:14 · 79 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
二刷,第一反应就是使用另外的数据结构来模拟。解决方法和我想的是一样的,只不过我想的是LinkedList,其它人用的是Stack。我的思路就是反方向的pushed,并且正方向的从popped中找。另外的思路其实更简单,那就是一直pushed,然后碰到和popped中的一样,那么class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer.原创 2021-02-19 23:48:30 · 125 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
第一反应是动态规划,但是这种线性的动态规划,还是有点找不到动态转移方程线性动态方程其实是很好做的,不要管什么优化解法,直接new一个dp数组,然后确定dp数组的每一个单位表示什么。从这个题来分析,我当前dp[i]想要用到dp[i-1],那么dp[i]自然就想到的是前i-1个(一定要包括i-1)最大的和是多少。接着就出来了动态方程dp[i] = Max(dp[i-1] + nums[i], nums[i])代码就写出来了class Solution { public int maxSubAr.原创 2021-02-19 23:47:49 · 94 阅读 · 0 评论 -
4. 寻找两个正序数组的中位数
想到的第一种方法就是插入排序,设置一个copy数组,然后将排序好的数字放进去。然后可以优化,直接到length/2的时候就能退出,并且可以节约空间class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int length1 = nums1.length; int length2 = nums2.length; int length = l.原创 2021-02-19 23:47:13 · 132 阅读 · 0 评论 -
114. 二叉树展开为链表
一开始想就是想着优化思想,结果官方解答用的就是暴力解法。然后看了其它的解答,发现思路其实很简单,通过不断的将右子树的结构挪到左子树的最右边的位置。class Solution { public void flatten(TreeNode root) { while (root != null) { if (root.left == null) { root = root.right; } else .原创 2021-01-20 23:08:26 · 84 阅读 · 0 评论 -
207. 课程表
这道题一开始没思路,但是感觉要使用dfs。看完解答之后,发现这是一个有向图问题,这类问题没有做过,这里记录一下。如何用dfs来实现这个。看一看示例2,可以发现,找到一个环,那就输出false,第二,明白在每一个课寻找完毕之后, 那么这些课就不会产生环;因为任何和环有关的节点一定会在第一时间找到。如何记录就直接用一个flag数组,1表示走过,-1表示没有环public boolean canFinish(int numCourses, int[][] prerequisites) { .原创 2021-01-20 23:07:32 · 74 阅读 · 0 评论 -
215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array著作权归领扣网络所有。商业转载请联系官方授.原创 2020-11-06 15:44:14 · 117 阅读 · 0 评论 -
316. 去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同示例 1:输入:s = “bcabc”输出:“abc”示例 2:输入:s = “cbacdcbc”输出:“acdb”提示:1 <= s.length <= 10.原创 2020-11-01 10:57:45 · 374 阅读 · 2 评论 -
82. 删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-so.原创 2020-10-29 20:05:34 · 113 阅读 · 0 评论 -
445. 两数相加 II
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 8 -> 0 -> 7来源:力扣(LeetCode)链接:https://leet.原创 2020-10-29 11:54:14 · 116 阅读 · 0 评论 -
92. 反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处.原创 2020-10-28 19:24:23 · 94 阅读 · 0 评论 -
203. 移除链表元素
删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5这道题和剑指offer第18题类似,但是比剑指offer题目要难一点,多一个的难点就是删除的元素可能存在多个,那么就不能再删除之后立马break,并且在一开始左剑指offer 18题的时候,有个地方没有完善,导致之后直接挪到203题的时候,就不能得出正确结果。那就是在找到一个目标节点之后,还执.原创 2020-10-27 13:59:11 · 191 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该.原创 2020-10-27 13:32:17 · 54 阅读 · 0 评论 -
206. 反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。这道题是第三遍做了,还是没有思路=-=。原因就.原创 2020-10-27 11:33:17 · 77 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树
这道题要明白一点的就是,构造高度平衡二叉树,也就间接的说要以数组中心元素为root节点,然后依次在左右儿子中添加节点。明白这一点之后,还需要一点就是,框定左树和右树的节点范围,用两个指针就行了。class Solution { public TreeNode sortedArrayToBST(int[] nums) { return BST(nums, 0, nums.length - 1); } public TreeNode BST(int[] nums, i.原创 2020-10-26 17:01:58 · 67 阅读 · 0 评论 -
669. 修剪二叉搜索树
这道题逻辑上要明白一点,那就是如果某个节点的值小于low,可以直接把该节点和左儿子抹掉;如果大于high,直接抹掉该root节点。下面是我自己写的代码,思路很清晰,但是不够简洁class Solution { int low = 0; int high = 0; public TreeNode trimBST(TreeNode root, int low, int high) { this.low = low; this.high = high.原创 2020-10-26 15:47:31 · 92 阅读 · 0 评论 -
450. 删除二叉搜索树中的节点
思考问题的时候一定要跳出之前的思维圈,一旦出错,就会一直困在里面!!!!删除二叉搜索树,在学数据结构的时候用C语言手敲了一遍。现在用Java来实现,发现毫无头绪!!!于是又在回忆之前的思路,结果越想越乱。然后完全抛弃之前的想法,开始独立思考。随便指定实例中的一个节点的时候,就发现了三种情况,俺就是这个节点可能含有左右儿子中的一个,或者两个都有,或者根本就没有儿子节点。那么对于不同的情况就要有不同的应对方式。对于树的形状的改变,有两种方法。第一种方法是,直接将有儿子替换当前节点,然后将当前节点的左儿.原创 2020-10-23 12:06:39 · 76 阅读 · 0 评论 -
543. 二叉树的直径
遇到二叉树遍历,那就是以前的老规矩,遍历只分两种——DFS和BFS,而DFS的遍历顺序要视情况而定。像这道题,要找最长路径,那么转换一下思路——两点确定一条直线,也就是要找连着最多的节点的路径。那么把三种遍历顺序放进去看,就能推出这要使用后序遍历。那么打出框架class Solution { public int diameterOfBinaryTree(TreeNode root) { dfs(root); } public int dfs(TreeNode r.原创 2020-10-19 21:29:00 · 118 阅读 · 0 评论 -
124. 二叉树中的最大路径和
树的遍历一定要用最特殊的情况来推导遍历方式。首先这道题要返回最大路径和,实例1已经很明显了的提示用后序遍历了。而且遍历一定要以最后的节点来作推导,不要用中间的节点来做推导。既然确定了用后序遍历,剩下的就只剩用在后序遍历代码中去添加相应的条件了。class Solution { public int maxPathSum(TreeNode root) { PathFind(root) } public int PathFind(TreeNode root.原创 2020-10-18 09:02:08 · 184 阅读 · 0 评论 -
222. 完全二叉树的节点个数
这道题前一种思路就是遍历每个节点,毫无疑问就是BFS和DFS了,这两种解法不看因为比较简单。另一种思路就是二分查找,如何查找?利用完全二叉树的性质。如果最后一层没有填满,那么只要遍历一半的子树,然后递归。如图所示完全二叉树,在root处,算出了左右节点的数量,那么直接算出左半子树的数量,然后递归算右半子树。下面用了一个语法糖,1<<left,和pow(2,left)是一样的道理。由于计组的东西忘了很多,一直以为是left左移一位,然后一直想不通=_= 。其实是1左移left位。class.原创 2020-10-17 14:53:08 · 105 阅读 · 0 评论 -
110. 平衡二叉树
开始想这道题的时候,想着使用bfs,然后遍历层数,通过每层节点数量和预期的数量的差距来找。按道理应该可以实现,但是实现的逻辑难度太大,遂放弃。然后看答案,看完发现是一个典型的DFS,只不过有点变种,首先找到叶子节点,然后当前返回0,然后最后通过判断如果left-right的绝对值大于1直接返回-1,如果小于等于1,那么就在结果上加1class Solution { public boolean isBalanced(TreeNode root) { return find(ro.原创 2020-10-17 08:37:31 · 96 阅读 · 0 评论 -
199. 二叉树的右视图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xErDYJ9k-1602816897480)(evernotecid://634D4913-C39A-4E76-BF68-A12CE0243626/appyinxiangcom/28638727/ENResource/p103)]这道题和116.填充每个节点的下一个右侧节点指针这道题是一模一样。这里就总结一下。两道题的一个关键点都是要遍历到树的每一层的最后一个节点。而116题还要寻找的一个节点就是每一层的第一个节点。那么如原创 2020-10-16 10:55:09 · 81 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。说明:字母异位词指字母相同,但排列不同的字符串。不考虑答案输出的顺序。示例 1:输入:s: “cbaebabacd” p: “abc”输出:[0, 6]解释:起始索引等于 0 的子串是 “cba”, 它是 “abc” 的字母异位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的字母.原创 2020-10-13 10:07:53 · 84 阅读 · 0 评论 -
209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。 进阶:如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。来源:力扣(LeetCode)原创 2020-10-13 10:06:27 · 75 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]来源:力扣(LeetCode)链接:ht.原创 2020-10-09 21:36:01 · 171 阅读 · 0 评论 -
33. 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例.原创 2020-10-08 09:31:40 · 100 阅读 · 0 评论 -
24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。迭代解法这道题很基础,不难,需要明白的就是背后的逻辑,.原创 2020-10-07 20:22:22 · 120 阅读 · 0 评论 -
94. 二叉树的中序遍历
这道题有两种解法,简单的就是直接使用递归,稍微复杂一点的就是使用非递归(迭代)。递归没什么好说的,直接上代码class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<>(); if (root == null) { return ans; } .原创 2020-09-22 09:45:56 · 105 阅读 · 0 评论 -
107. 二叉树的层次遍历 II
这道题比较简单,只是一个bfs,没什么要注意的,只是在存储数字的时候,记得把后面的数组放到最前面。我选用了linkedlist进行操作。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solut.原创 2020-09-18 12:41:56 · 104 阅读 · 0 评论 -
103. 二叉树的锯齿形层次遍历
这道题看起来和102的bfs就只有稍微一点区别,但并非如此,这道题的逻辑性更强,最重要的是确定如何锯齿状的遍历二叉树,这是一个没有遇到过的问题。解决的方法要跳出当前的思维圈,但是也要留在当前思维圈。首先个人锯齿访问是很简答,3->20->9->15->7,人工访问很简单,但是如何将其转化为代码?首先要想到的是,我们个人是如何做到到锯齿状的排序?是因为到了边界,而如何判断到了边界,那就是左边或者右边没有数字了,也就是null,所以第一步就是在访问每一层的时候在相应访问到的边界数字.原创 2020-09-18 10:47:00 · 227 阅读 · 0 评论 -
60. 第k个排列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。说明:给定 n 的范围是 [1, 9]。给定 k 的范围是[1, n!]。示例 1:输入: n = 3, k = 3输出: “213”示例 2:输入: n = 4, k = 9输出: “2314”来源:力扣(LeetCode)链接:.原创 2020-09-16 21:27:54 · 241 阅读 · 0 评论 -
47.全排列 II
给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。这道题和46题基本一致,不同之处在于结果不能重复。如何避免重复,也就是如何剪枝。在46题中,我们用一个boolen型数组,来记录某个数字是否已经使.原创 2020-09-15 09:20:08 · 201 阅读 · 0 评论 -
39. 组合总和
题目地址因为是专门训练回溯题型,第一种算法想到的便是回溯算法。因为这道题中所给数组的数字可以重复利用,所以在设计具体的求法的时候,就考虑到用树状图,每次给子节点赋予所有的值,那么就很容易往遍历数组方面想,但是遍历数组要遍历很多次,真的需要遍历这么多次数的数组吗?肯定不需要。要明白的是,这个方法叫做回溯,第一个字是回,得回去,所以先得跑到数组的末尾位置,然后开始求和,对于点那个叶子的求和也得进行回溯,先到达数组的末端,然后回溯求和。如下面图片,先得进行回溯,左儿子,然后求和,每个叶子的右儿子。这样的话原创 2020-09-12 09:17:46 · 96 阅读 · 0 评论 -
17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/letter-combinations-of-a.原创 2020-09-05 09:13:07 · 212 阅读 · 0 评论 -
整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII&nb.原创 2020-08-26 10:49:21 · 138 阅读 · 0 评论