![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
山山川川
这个作者很懒,什么都没留下…
展开
-
Leetcode 剑指 Offer 38. 字符串的排列
2.这道题的每一层都是需要从 0 开始搜索 而不是从 index 开始 , 这也是排序类型的特点。1.这道题需要对使用过的元素进行记录 (在排列类型中一个元素只能使用一次)排列类型的基础题,如果有不理解的可以动手画一下abc在程序中是怎么走的。原创 2023-01-12 13:19:36 · 183 阅读 · 1 评论 -
Leetcode 146.LRU缓存 记录反思
链接很难,官方提供了两种做法,做完思路还是不明确,所以记录一下深入反思1.LinkedHashMap2.hashmap + 双端队列这道题目的意思可能就是打算让我们封装一个双端队列出来所以主要记录一下第二种实现方法从题目要求可以看到 get 和 put 都需要 时间复杂度为 O(1) ,所以可以很简单的想到需要使用 map来实现,然后题干中还有一个要求, 如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。 逐出最长不使用的元素,先想着用队列,但是一般的队列还.原创 2022-04-20 21:46:32 · 128 阅读 · 0 评论 -
Leetcode 98.验证二叉搜索树(中序遍历) 记录反思
众所周知,如果树是二叉搜索树,中序遍历出来的顺序就是递增顺序,顺着这个思路就很好写出代码先中序遍历把值存起来,然后判断值是不是单调递增的class Solution { List<Integer> list = new ArrayList<>(); public boolean isValidBST(TreeNode root) { inorder(root); for(int i = 1; i < list.size();.原创 2022-03-21 13:12:35 · 291 阅读 · 0 评论 -
Leetcode 653. 两数之和 IV - 输入 BST(前序遍历,set) 记录反思
如果你还记得Leetcode 第一题,那么这题主体思路就已经有了,定义一个set来判断k - node.val 是否存在于 set中,如果不存在就将当前node.val存到set中Leetcode 第一题是一个数组,依次遍历就好了,但是这个题是一个二叉树,所以需要用到树的遍历class Solution { Set<Integer> set = new HashSet<>(); public boolean findTarget(TreeNode root, i.原创 2022-03-21 11:04:34 · 322 阅读 · 0 评论 -
Leetcode 491.递增子序列(回溯) 记录反思
这题属于回溯题里面的树层去重的问题.前面的子集II它属于树枝去重和这题去重方法不一样.树层去重需要多加一个use数组来记录当前什么元素已经被使用过了,思想类似于 数组哈希表,创建一个数组,如果这个元素已经出现过了,那么就就当数组当前下标位置的元素置为1 ,之后的所有元素在递归前都要判断自己是否已经递归过了class Solution { private List<Integer> path = new ArrayList<>(); private List&l.原创 2022-03-20 13:53:23 · 113 阅读 · 0 评论 -
Leetcode 90. 子集 II(回溯) 记录反思
回溯的题目如果需要去重,首先肯定是要先排序,然后当前下标元素和前一个小标元素相等的话,就跳过当前循环建议拿[2,2,1]在自己脑子里面跑一下代码class Solution { List<List<Integer>> list = new ArrayList<>(); LinkedList<Integer> li = new LinkedList<>(); public List<List<Integer&.原创 2022-03-20 11:17:28 · 295 阅读 · 0 评论 -
Leetcode 131.分割回文串(回溯) 记录反思
回溯:首先 思考递归函数的入参然后 寻找递归函数的终止条件最后 找到单层循环逻辑一开始我想的先把所有字串找出来,然后扔到判断回文函数里面依次判断,然后查了之后发现 可以 在插入的时候就判断,会快非常多回溯,不理解就自己带入参数自己脑子运行一遍,就会清楚逻辑class Solution { List<List<String>> list = new ArrayList<>(); LinkedList<String> li =new .原创 2022-03-19 21:52:43 · 106 阅读 · 0 评论 -
Leetcode 78.子集(回溯) 记录反思
这可能是最适合入门的回溯问题需要遍历所有情况 ,所以不需要剪枝难得自己写出来一题回溯,真的算比较简单的,大家可以认真分析这题来入门回溯回溯真的不大好解释,最好的方法就是对着代码用自己脑子跑一遍,这样比题解都清楚class Solution { List<List<Integer>> list = new ArrayList<>(); LinkedList<Integer> li = new LinkedList<>();.原创 2022-03-19 21:44:29 · 924 阅读 · 0 评论 -
Leetcode 40.组合总和II(回溯) 记录反思
和 39.组合总和差不多,但是这题涉及到一个新问题,这题元素只能使用一次,如果出现两个或多个相同的元素,答案就会出现重复所以需要做去重操作去重可以在两个地方去重一个是在调用函数之前先把数组去重,还有一个是在处理数组的时候,遇到和前一个相同的情况就跳过当前循环,也能达到目的,其他的和第39题一毛一样我选用第二种class Solution { List<List<Integer>> list = new ArrayList<>(); Linke.原创 2022-03-18 21:44:23 · 217 阅读 · 0 评论 -
Leetcode 39. 组合总和(回溯) 记录反思
我觉得我终于稍微理解回溯了看了这个图看了好久,之前一直在想,每次回溯都拿原数组不会有重复结果吗,然后看图才明白从一个元素递归进入之后,这个元素的所有结果都会被选出,后面的就从别的元素开始了真的要好好对照的N叉树的遍历的思路好好想一下,真的很像回溯的代码还有有点不好写原始//击败 55%class Solution { List<List<Integer>> list = new ArrayList<>(); LinkedList<In.原创 2022-03-18 19:47:39 · 193 阅读 · 0 评论 -
Leetcode 77.组合(回溯) 记录反思
今天在做HOT一百的时候发现,之前回溯相关的问题还没有学习,就花了一点时间学习一下,如果不知道回溯的同学可以看一下这个视频,听完大概就懂这一类问题了这种题目特别像 589. N 叉树的前序遍历,但是比N叉树多一个回溯过程//未剪枝 18ms 击败 23%class Solution { List<List<Integer>> res = new ArrayList<>(); Deque<Integer> que = new Linke.原创 2022-03-17 20:49:52 · 340 阅读 · 0 评论 -
Leetcode 720.词典中最长的单词(set) 记录反思
思路:先将 words 数组按 String长度从小到大排序,如果长度相同的话就按照 ASCII 表排序 ,满足题目中优先返回字典序小的单词定义一个Set,在set 中 判断是否存在words[i].substring(0,words[i].length() -1),如果存在就说明 words[i]可以是其他单词加一得出的,最后返回最长的单词即可class Solution { public String longestWord(String[] words) { Array.原创 2022-03-17 11:28:26 · 98 阅读 · 0 评论 -
Leetcode 143.重排链表(链表) 记录反思
思路:取中点 + 反转后半段链表 + 合并前后链表在做这一题的时候发现 Leetcode 206.反转链表 我还不会,所以先找了一篇文章学习了一下如何反转链表(https://blog.csdn.net/qq_17550379/article/details/80647926)取中点快慢指针,快指针每次走两步,慢指针一部 ,当快指针走到尾部的时候,慢指针的位置就正好在中间 private ListNode midNode(ListNode node){ ListNode f..原创 2022-03-16 18:47:15 · 564 阅读 · 0 评论 -
Leetcode 剑指 Offer II 069. 山峰数组的顶部(二分) 记录反思
首先提示,题目的数组在坐标轴上的形状是个倒V ,不是 W思路:使用二分法,去mid与mid-1对应值进行比较.如果小于就说明mid对应值在递减坡度上,就移动right到mid-1的位置上.如果大于就说明mid对应值在递增坡度上,就移动left 到mid+1的位置上.循环往复注意一点:left不能从端点开始,会数组越界.如果数组是单调递增或者单调递减的话,返回结果是0,所以left和right都可以不用在端点开始class Solution { public int peakIndex.原创 2022-03-16 10:11:08 · 440 阅读 · 0 评论 -
Leetcode 75.颜色分类 (双指针) 记录反思
一个神奇的题目,写起来哪哪都是问题,搞了好长时间,难道我的思路太简单了,而这题不是想的那么简单思路是双指针指向 头p0 尾p2, for i 遍历 每一个 下标对应值,如果等于 0 的话就交换p0和i下标的内容,如果等于2的话就交换p2和i下标内容出现的问题1.循环终止条件要写成 i <= p2 ,一开始for循环 i 终止条件 写的是 i < nums.length ,结果错了,最后的结果是002211,2在中间,发现如果i的下标大于p2的话,i指向的内容一定是2,这个时候p2指向的内.原创 2022-03-15 17:41:39 · 720 阅读 · 0 评论 -
Leetcode 64. 最小路径和(动态规划) 记录反思
和62.不同路径大同小异先定义推导数组 dp的含义,因为是求右下角的结果,所以dp数组的意义是dp[i][j]: 0,0位置到i,j位置的最小路径和数组的初始化:因为最上边和最左边的两条路是固定的,所以初始化这两边dp的推导公式dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + nums[i][j],因为题目说了只能向右或者向下走,所以,只有两个方向可以到达i,j点.去这两个方向的最小值然后加上当前nums[i][j] ,就是当前点的最小路径和clas..原创 2022-03-15 14:41:56 · 840 阅读 · 0 评论 -
Leetcode 48. 旋转图像(翻转交换) 记录反思
先上下行进行翻转,然后对主对角线进行反转class Solution { public void rotate(int[][] matrix) { int n = matrix.length; for (int i = 0; i < n / 2; ++i) {//可以直接这样交换, ///就不用写俩个for循环了 int[] temp = matrix[i]; matrix[i.原创 2022-03-14 15:53:59 · 108 阅读 · 0 评论 -
Leetcode 599. 两个列表的最小索引总和(哈希表) 记录反思
题目有两个需要注意的点为什么返回值是数组?是因为什么时候不止一个呢[“a”,“B”,“C”][“C”,“B”,“a”]这个时候不止一个做法就是先将list1放入到map中,list[]做key,下标做value然后再定一个循环判断list2中的值是否在map中存在比当前下标和还要小的,存在就修改最小下标和然后清空存储string的list,如果下标和等于最小下标和就直接添加class Solution { public String[] findRestaurant(String.原创 2022-03-14 13:08:06 · 788 阅读 · 0 评论 -
Leetcode 33. 搜索旋转排序数组(二分) 记录反思
排序数组,目标值,logn,就差告诉我用二分了不知道在哪里旋转,所以需要判断每次定位的位置是在旋转到前面的那部分,还是在原本的前面那部分如何判断?每次二分找到的中间值,可以和left 和 right 左右指针所知位置比较,比如如果nums[mid] > nums[right] ,说明[left ,mid ]是旋转到前面的那部分,然后就可以对这部分进行判断目标值是否在其中class Solution { public int search(int[] nums, int target).原创 2022-03-14 00:24:48 · 196 阅读 · 0 评论 -
Leetcode 32. 最长有效括号(栈) 记录反思
做不出来,看答案看懂了class Solution { public int longestValidParentheses(String s) { int max = 0; Deque<Integer> que = new LinkedList<Integer>(); que.push(-1); for (int i = 0; i < s.length(); i++) { if.原创 2022-03-13 23:37:38 · 389 阅读 · 0 评论 -
Leetcode 5.最长回文子串(中心扩散) 记录反思
做回文题目最快的方法是马拉车算法,但是面试不考,那就写简单一点的算法吧中心扩散法,应该是第一时间想到的算法依次遍历每个点然后对当前点 向两边扩散找到回文class Solution { public String longestPalindrome(String s) { if(s == null) return ""; int left = 0; int right = 0; int slen = s..原创 2022-03-13 20:45:44 · 451 阅读 · 0 评论 -
Leetcode 11. 盛最多水的容器(双指针) 记录反思
Leetcode 热题一百做这个题目首先要确定双指针如何移动才能找到最大值去掉重复情况头尾指针最优情况是头尾对应高度最高,最后得到的面积肯定是最大,所以先从头尾开始,比较左右高度,小的向大的方向靠近就有可能找到比当前还要大的高度,直到遍历一遍数组结束所以时间复杂度是O(n)class Solution { public int maxArea(int[] height) { int left = 0; int right = height.length -..原创 2022-03-13 16:19:53 · 1223 阅读 · 0 评论 -
Leetcode 213.打家劫舍II(动规) 记录反思
这题和198.打家劫舍唯一的不同就是.数组成环了,所以需要分情况讨论情况一:最大值出现在 0 ~ nums.length-2 的位置上情况二:最大值出现在 1 ~ nums.length-1 的位置上这样就将首位相连的情况分割开了class Solution { public int rob(int[] nums) { int len = nums.length; if(len == 1) return nums[0]; .原创 2022-03-13 08:59:47 · 77 阅读 · 0 评论 -
Leetcode 198. 打家劫舍(动规) 记录反思
动规的入门题把dp写成nums,一不小心就提交了6次才过class Solution { public int rob(int[] nums) { if(nums.length == 1) return nums[0]; if(nums.length == 2) return Math.max(nums[0],nums[1]); int [] dp = new int [nums.length];.原创 2022-03-11 21:40:25 · 188 阅读 · 0 评论 -
Leetcode 121.买卖股票的最佳时机(贪心) 记录反思
实时更新最大值和最小值,然后返回最大值就好了class Solution { public int maxProfit(int[] prices) { int len = prices.length; int min = prices[0]; int max = Integer.MIN_VALUE; for(int i = 0; i < len ; i++){ i.原创 2022-03-11 21:11:06 · 116 阅读 · 0 评论 -
Leetcode 96. 不同的二叉搜索树(动规) 记录反思
递归难题第一步:还是老样子先写出递推数组的含义dp[i] :是整数i 个节点组成的节点的二叉搜索树种数第二步:找到dp数组的递推公式先画个图看看我思考了很久,一开始我想的是新的节点要插在哪里,然后发现这个思路错了所以 dp[3] = dp[0] * dp[2] + dp[1]*dp[1] + dp[2]*dp[0],所以对于某一个节点dp[i]都可以看作是其左右节点是dp[i-j] * dp[j -1]的循环相加class Solution { public int num.原创 2022-03-11 21:03:02 · 869 阅读 · 0 评论 -
Leetcode 343. 整数拆分(动规) 记录反思
做的第一道中等递归,还是有一点难度的第一步:递归首先要确定递归数组的功能dp[i] : 数字i的最大整数拆分值第二步:写出递推表达式,我一般习惯写出几个值然后找推导关系这个题目的dp[0] 和 dp[1] 理论上是没有意义的,所以从dp[2] 开始dp[2] = 1 => 1x1dp[3] = 2 => 1x2dp[4] 可以是 dp[3]* 1 或者 dp[2] * 2 或者是 2+2 中的最大值dp[3] *1 就相当于 1+2+1 dp[2]*2 就相当于.原创 2022-03-11 20:18:24 · 506 阅读 · 0 评论 -
Leetcode 63.不同路径II(动规) 记录反思
leetcode 62 题变种,可以先去看一下我写的62题解析这题和62题十分相似,首先我们要明白这个路径上如果出现了一个障碍意味着什么,说明这条路直接走不通不用记在总数里.如果这条路出现在上边界或者左边界的话,那么障碍之后的路永远也无法在走到了所以在数组初始化的时候要做一个判断,如果路径上出现了障碍物,这条路直接退出其他的和62题一摸一样class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) .原创 2022-03-10 23:47:14 · 98 阅读 · 0 评论 -
Leetcode 62.不同路径(动规) 记录反思
谢邀,机器人很可爱,题目很有意思,下次还来做动态规划最最核心的一点就是,如何写出递推公式,递推公式就是如何通过这个公式可以推导出全部的值动规首先需要有一个数组来存储推导状态下的中间值,对于这一题.dp[i][j]表示从(0,0)出发到(i,j)的路径数其次要先对数组进行初始化,因为所有的值都是从初始化的值一步一步推导出来的.对于这一题的初始化,我们要先找到直接可以确定的值,可以发现这两条边每一个位置是确定的只有一条路可以走到这里(不可以往上有往下啊),所以对这两条边全部初始化成 1然后就可以.原创 2022-03-10 20:29:27 · 98 阅读 · 0 评论 -
Leetcode 509.斐波拉契数(动规 迭代和递归) 记录反思
也是动态规划的经典题目,利用前面几个值可以推出后面的值依次反复,这就是动规,虽然这个很简单非常适合初学者入门动规可以递归也可以迭代//递归,真的很慢class Solution { public int fib(int n) { if(n == 0) return 0; if(n == 1) return 1; if(n == 2) return 1; r.原创 2022-03-10 19:41:20 · 7194 阅读 · 0 评论 -
Leetcode 70.爬楼梯(动规 数组) 记录反思
经典动态规划题目,利用前两个值求出第三个值class Solution { public int climbStairs(int n) { int[] dp = new int[n + 1]; if(n == 1) return 1; if(n== 2) return 2; dp[0] = 1; dp[1] = 1; dp[2] = 2; .原创 2022-03-10 19:38:15 · 160 阅读 · 0 评论 -
Leetcode 746.使用最小花费爬楼梯(动规) 记录反思
先看代码后看图class Solution { public int minCostClimbingStairs(int[] cost) { int [] dp = new int [cost.length ]; if(dp.length == 1) return cost[0]; if(dp.length == 2) return Math.min(cost[1],cost[0]); .原创 2022-03-10 19:33:16 · 101 阅读 · 0 评论 -
Leetcode 738.单调递增的数字(贪心) 记录反思
这么多唯一一个题目不是阅读理解的贪心局部最优:遇到strings [i - 1] > strings [i]的情况,让strings [i - 1]–,然后strings [i]给为9,可以保证这两位变成最大单调递增整数。class Solution { public int monotoneIncreasingDigits(int n) { String nn = n+""; String[] strings = (n+"").split(""); .原创 2022-03-09 21:23:38 · 91 阅读 · 0 评论 -
Leetcode 135. 分发糖果(贪心) 记录反思
有一个需要说明的点,就是如果是递增的话,那每次都要比前面多一次这个题目对于一个孩子来说,前面比他大后者后面比他大,前后都要加1,所以要思考两个方向,但是不能两个方向一起思考,所以可以选用两次循环,从头到尾找比自己小的前驱,然后从尾到头找比自己小的后驱先看代码后看图class Solution { public int candy(int[] ratings) { if(ratings.length == 1){ return 1; } .原创 2022-03-09 20:36:52 · 95 阅读 · 0 评论 -
Leetcode 137.加油站(贪心) 记录反思
贪心找局部最优解局部最优,说明每一步都是找到的class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int cursum = 0; //用来存放当前,加的油和路程的差值,如果差值小于0就不可能达到下个加油站,所以匹配的所有路径都不能做起始点 int totelsum = 0;//总的油数目和总路程的差值,如果总油小于总路程,那就说明不能跑完全程 int re.原创 2022-03-09 18:36:10 · 95 阅读 · 0 评论 -
Leetcode 860. 柠檬水找零(贪心) 记录反思
有的时候就应该找点简单题目提升一下自己的驱动力有三种情况情况一:账单是5,直接收下。情况二:账单是10,消耗一个5,增加一个10情况三:账单是20,优先消耗一个10和一个5,否则,消耗三个5五块钱最珍贵,所以能省五块省五块,前两种情况没得选,所以第三种情况优先退一张十块一张五块的class Solution { public boolean lemonadeChange(int[] bills) { int wu = 0; int shi = 0; .原创 2022-03-09 11:02:44 · 64 阅读 · 0 评论 -
Leetcode 45.跳跃游戏II(贪心) 记录反思
这个题目的答题思路和55那题很像,但是比他要难一点.问题的核心思路就是,达到完全覆盖数组需要多少次,所以需要记录每次扩容class Solution { public int jump(int[] nums) { if (nums == null || nums.length == 0 || nums.length == 1) { return 0; } int step = 0; //后一步可覆盖最大区.原创 2022-03-08 23:43:19 · 2652 阅读 · 0 评论 -
Leetcode 513. 找树左下角的值(层序遍历和递归) 记录反思
二十载余,至今不识递归为何物.我怎么写递归这么困难呢’还是层序遍历简单,不过还是要挑战一下自己的软肋这个题目不是找最左节点,是找一层上最左边的节点,所以这个节点也可以是右节点,我感觉每次自己都会读错题目意思//层序遍历class Solution { public int findBottomLeftValue(TreeNode root) { Deque<TreeNode> que = new LinkedList<>(); que.原创 2022-03-08 21:32:52 · 80 阅读 · 0 评论 -
Leetcode 404. 左叶子之和(递归) 记录反思
看清楚题目,是找左子节点,不是找左节点,我都自闭了为啥这么简单的题目都不能bugfree ,气死.今天钱没带够网吧下机了,就写一种答案class Solution { int sum = 0; public int sumOfLeftLeaves(TreeNode root) { sumOfLeftLeave(root); return sum; } void sumOfLeftLeave(TreeNode node){ .原创 2022-03-08 20:54:41 · 77 阅读 · 0 评论 -
Leetcode 257. 二叉树的所有路径(递归与迭代) 记录反思
class Solution { /** * 递归法 */ public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList<>(); if (root == null) { return res; } List<Integer>..原创 2022-03-08 20:29:06 · 161 阅读 · 0 评论