![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
想进阿里的小菜鸡
小小菜鸡的进阶之路
展开
-
LeetCode581+621+207
LeetCode581+621+207原创 2022-08-01 15:59:09 · 93 阅读 · 0 评论 -
LeetCode240+312+394
LeetCode240+312+394原创 2022-07-28 15:26:10 · 103 阅读 · 0 评论 -
leetcode221. 最大正方形
leetcode221+234+238原创 2022-07-09 17:01:57 · 385 阅读 · 1 评论 -
LeetCode136+128+152+148
136+128+152+148原创 2022-07-01 20:13:30 · 213 阅读 · 0 评论 -
LeetCode85+105+114+124
leetCode85+105+114+124原创 2022-06-29 15:55:58 · 86 阅读 · 0 评论 -
LeetCode76+79+84
LeetCode76+79+84原创 2022-06-15 20:46:07 · 112 阅读 · 1 评论 -
LeetCode55+56
LeetCode55+56原创 2022-06-13 20:22:31 · 426 阅读 · 0 评论 -
LeetCode75. 颜色分类+LeetCode49. 字母异位词分组
LeetCode75. 颜色分类+LeetCode49. 字母异位词分组。原创 2022-06-07 19:48:07 · 78 阅读 · 0 评论 -
LeetCode42. 接雨水 && LeetCode48. 旋转图像
LeetCode42. 接雨水 && LeetCode48. 旋转图像原创 2022-06-06 20:18:55 · 95 阅读 · 0 评论 -
LeetCode34. 在排序数组中查找元素的第一个和最后一个位置
LeetCode34。用两种方法求解原创 2022-06-05 21:08:56 · 86 阅读 · 0 评论 -
LeetCode33. 搜索旋转排序数组
LeetCode33题用二分法解决原创 2022-06-05 20:22:00 · 68 阅读 · 0 评论 -
LeetCode32. 最长有效括号
LeetCode32原创 2022-06-04 20:53:42 · 127 阅读 · 0 评论 -
LeetCode
leetCode31原创 2022-06-04 20:01:05 · 81 阅读 · 0 评论 -
LeetCode23. 合并K个升序链表
优先队列原创 2022-06-01 20:28:26 · 87 阅读 · 0 评论 -
LeetCode22. 括号生成
LeetCode22. 括号生成回溯算法解决原创 2022-06-01 19:42:01 · 171 阅读 · 0 评论 -
LeetCode21. 合并两个有序链表
LeetCode热题100原创 2022-05-31 20:23:44 · 64 阅读 · 0 评论 -
LeetCode11. 盛最多水的容器
思路用左右两个指针遍历数组,每次移动一个指针,另一个指针不动,每移动一次就计算一次容量。容量=(r-l)*min。左右指针最小值为min。此时基本思路已经知道了,就剩下指针如何移动了。无论是移动短板或者长板,我们都只关注移动后的新短板会不会变长,而每次移动的木板都只有三种情况,比原短板短,比原短板长,与原短板相等;如向内移动长板,对于新的木板:1.比原短板短,则新短板更短。2.与原短板相等或者比原短板长,则新短板不变,容量变小。所以,向内移动长板,一定不能使新短板变长。代码class S.原创 2022-05-31 19:52:46 · 66 阅读 · 0 评论 -
LeetCode10. 正则表达式匹配
思路c*:可以是c...c或者空或者是c。首先将dp数组初始化。dp[0][0] = true;那么其真正的起始位置是dp[1][1]。那么初始化时dp数组的长度就是s和p的长度+1;对于aab和c*a*b这一种情况,只能把c*先删除,所以初始化的时候才有一个for循环来初始化。然后就是s和p的下标对比了有三大种情况:①:s.charAt(i)==p.charAt(j)则dp[i+1][j+1]=dp[i][j];这里i+1和j+1就是因为dp[0][0]不是从00开始的。②...原创 2022-05-28 20:39:37 · 163 阅读 · 0 评论 -
LeetCode5. 最长回文子串
思路1.动态规划:用动态规划实现的。这个题和最长回文子串的长度的题很相似,就多了一个截取字符串的过程2.中心扩散就是遍历各个字符,以该字符为中心向其左右两边扩散。一次比较扩散后的两个元素是否相等。但是会有一种情况就是以两个元素为中心扩散的方式。所以要考虑两种情况。代码1.动态规划class Solution { public String longestPalindrome(String s) { if(s == null || s.length() ==原创 2022-05-27 20:17:00 · 55 阅读 · 0 评论 -
LeetCode3. 无重复字符的最长子串
思路思路就是从左到右每次加入一个元素,存到list中,如果当前要加入的元素在list中,就从左到右一次删除一个元素,直到list中无当前元素为止;如果加入的元素不在list中,就直接加入即可。代码class Solution { public int lengthOfLongestSubstring(String s) { if(s.length() == 1 || s.length()==0){ return s.length();原创 2022-05-24 20:07:28 · 59 阅读 · 0 评论 -
LeetCode2. 两数相加
思路首先,要注意有进位的问题,进位的数字下一次计算也会计算,所以就用text来保存进位。在最后结束的时候,如果进位text不为空,还要在链表尾追加一个节点,其值为text。其次,两个链表的长度不一样,一个链表遍历完了,另一个没遍历完要补0.我这里没有补0节点,而是在计算值的时候用0代替。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode原创 2022-05-23 20:39:44 · 93 阅读 · 0 评论 -
LeetCode347. 前 K 个高频元素
思路就是先对元素进行统计,用map来存储;然后用小顶堆来排序,得到最后的k个最大的元素。代码class Solution { public int[] topKFrequent(int[] nums, int k) { int length = nums.length; int[] res = new int[k]; Map<Integer,Integer> map = new HashMap<>();原创 2022-05-22 17:17:44 · 136 阅读 · 0 评论 -
LeetCode239. 滑动窗口最大值
思路暴力解法会时间超时。所以就只能用单调队列来解决了。首先用数组来实现单调队列,定义一个数组,用来实现单调队列里面存放下标,head指向队列的头节点(且当前头结点在滑动窗口内),tail指向队列的尾结点。1.队列加入元素当队列要加入一个元素时,因为本题是单调递增的,所以在加入一个元素时,如果当前元素比队列尾部元素小,就直接加入;如果比尾部元素大,就把队列里所有比当前元素小的元素删除,然后将当前元素加入队列即可。2.判断窗口向前滑动当队列头指针指向的元素已经不在当前窗口内里就是窗口向后原创 2022-05-22 16:16:09 · 106 阅读 · 0 评论 -
LeetCode150. 逆波兰表达式求值
思路就是遇到符号就将栈里面的元素弹出两个,进行计算;要注意下弹出栈的顺序。不是符号就入栈。代码class Solution { public int evalRPN(String[] tokens) { Stack<String> stack = new Stack<>(); for(int i =0;i<tokens.length;i++){ if(tokens[i].equals("+")原创 2022-05-17 20:41:58 · 78 阅读 · 0 评论 -
LeetCode1047. 删除字符串中的所有相邻重复项
思路遍历字符串,每遍历一个就将字符和栈顶的元素比较,一样就将栈顶元素弹出,不一样就加入。最后返回即可。代码class Solution { public String removeDuplicates(String s) { Stack<Character> stack = new Stack<>(); for(int i =0;i<s.length();i++){ char ch = s.charA原创 2022-05-17 20:15:52 · 168 阅读 · 0 评论 -
LeetCode20. 有效的括号
思路首先要遍历字符串,没遍历一个字符就对其进行比较,如果是(、{、【其中的一个就将)、}、】压入栈中,如果都不是上面的三种情况,就将栈中的栈顶元素和当前的字符进行比较,如果一样就将栈顶元素弹出,不一样就返回false,代码class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for(int i =0原创 2022-05-17 20:08:31 · 135 阅读 · 0 评论 -
LeetCode51. N 皇后
思路首先要知道在棋盘的什么位子可以放置棋子。当前位子所在的列所在的行以及其所在的两个对角线如果有棋子存在就不能放了。所以isVaild()函数已经就是这样写的。然后就是回溯的一般步骤。需要注意的时,在放置棋子时,要进行判断,如果满足条件就放置,如果不满足就不放,并且回溯是在满足条件的基础上进行的(可以参照图片来理解)。代码随想录的图如下:代码class Solution { List<List<String>> res = new ArrayLis.原创 2022-05-16 21:41:14 · 82 阅读 · 0 评论 -
LeetCode47. 全排列 II
思路这个题和上一题的全排列不同的地方是有重复的数字。需要去重,这里去重有两种方法:一个是用set去重,一个将数组排序然后用used数组去重。重点说下用used数组去重:因为是排列问题,所以就要用used数组记录遍历的元素,而去重刚好也要记录遍历的元素,所以就二者合二为一了。首先对数组进行排序,当一个元素没有被使用的时候usede是false,被使用过后就是true,所以当nums[i-1] == nums[i] && used[i-1]==false时,表明该元素在.原创 2022-05-14 11:00:24 · 80 阅读 · 0 评论 -
LeetCode46. 全排列
思路每一个回溯算法都可以用树形结构来展示。如下是代码随想录的图从上面的图中不难看出,每次使用一个元素后就将其在used数组中进行标记,这个不是每一层一个used数组所以不需要在for循环上面重新new数组,这个是和递增子序列不同的地方。代码class Solution { List<Integer> path = new ArrayList<>(); List<List<Integer>> res = new Array.原创 2022-05-14 10:49:06 · 181 阅读 · 0 评论 -
LeetCode491. 递增子序列
思路首先该题是求递增子序列,那么就不能对数组进行排序。可以看下代码随想录的题解可以从上图看到每一层的元素不可以重复,而且原数组不能排序。所以就只能没一层插入一个元素就记录一个元素,到下一层循环的时候该层的记录就清空。这就是为什么要把userd数组在for循环上重新new一个的原因。代码class Solution { List<Integer> path = new ArrayList<>(); List<List<Integer&.原创 2022-05-14 10:07:56 · 239 阅读 · 0 评论 -
LeetCode90. 子集 II
思路方法一:本题和上一题的子集问题最大的不同就是有重复的数字,就需要去重。和之前的去重的一样的就是要先排序然后把结果用set保存。方法二: 用Boolean数组来解决,如果同一个树枝使用过是true,如果是同一个树层使用是false。代码用set处理class Solution { List<Integer> path = new ArrayList<>(); Set<List<Integer&g...原创 2022-05-13 20:22:36 · 199 阅读 · 0 评论 -
LeetCode78. 子集
思路这个是子集问题,需要把所有节点都加入到res中,而组合和切割是只加入叶子节点。子集的返回就是当遍历到叶子节点时就返回。代码class Solution { List<Integer> path = new ArrayList<>(); List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> s原创 2022-05-12 20:47:32 · 144 阅读 · 0 评论 -
LeetCode93. 复原 IP 地址
思路这个和切割回文串很类似,就是在切割后要判断下是否是ip地址。这个的判断字符串是否是在0~255用的是ASCII码判断的,值得借鉴。代码class Solution { List<String> res = new ArrayList<>(); public List<String> restoreIpAddresses(String s) { backtracking(s,0,0); return re原创 2022-05-12 20:14:23 · 153 阅读 · 0 评论 -
LeetCode131. 分割回文串
思路这道题和之前的组合问题一样,就是在将一个结果加入到path中需要判断下是否是回文字符,如果是就加入,不是接遍历下一个。代码class Solution { List<String> path = new ArrayList<>(); List<List<String>> res = new ArrayList<>(); public List<List<String>> partit原创 2022-05-11 20:14:32 · 156 阅读 · 0 评论 -
LeetCode40. 组合总和 II
思路此题就是要考虑去重的问题。不去重就和之前的一样。去重的话要知道是在横向去重还是纵向去重,根据输出的结果知道是横向去重。所以在回溯结束后,不能用和之前一样的数字。所以需要以下判断当前的值之前是否用过,深度用过后就是ture,回溯后就是false。所以需要将数组排序下,然后根据前后的值和前一个user标致来决定是否continue;代码class Solution { List<Integer> path = new ArrayList<>(); Lis原创 2022-05-11 19:33:05 · 266 阅读 · 0 评论 -
LeetCode39. 组合总和
思路1.确定集合参数两个参数int[] candidates, int target一定有,还有一个sum计算当前和,因为是从一个集合取数字,所以还需要startIndex。2.递归终止条件当sum大于target时结束,当sum==target时记录结果。3.单层递归逻辑取出对应的数字然后计算sum,将数字存入到path中,再去计算下一个,因为可以取重复的,所以下一次的开始位置是当前下标位置,最后回溯将sum和path减去即可。代码class Solution {原创 2022-05-10 21:23:54 · 95 阅读 · 0 评论 -
LeetCode17. 电话号码的字母组合
思路首先要根据输入的数字得到对应的字符串。然后用回溯算法的三步。1.确定递归函数的参数两个参数是输入的数字,和字符串数组,然后还需要一个参数来记录当前是在处理第几个数字。2.递归终止条件当结果字符串的长度等于处理的数字的个数时,表示递归结束。将结果存入到结果中。3.单层处理逻辑单层递归就是向path中加入字符,然后处理下一个数字,最后回溯把最后一个字符删除。代码class Solution { List<String> res = new Arr原创 2022-05-10 21:07:34 · 120 阅读 · 0 评论 -
LeetCode216. 组合总和 III
思路根据回溯的模板就很容易想到了。代码class Solution { List<Integer> path = new ArrayList<>(); List<List<Integer>> res = new ArrayList<>(); int sum =0; public List<List<Integer>> combinationSum3(int k, int n)原创 2022-05-09 20:30:23 · 132 阅读 · 0 评论 -
LeetCode77. 组合
思路代码class Solution { List<Integer> path = new ArrayList<>(); List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { backtracking(n,k,1);原创 2022-05-09 19:53:53 · 108 阅读 · 0 评论 -
LeetCode538. 把二叉搜索树转换为累加树
思路方法一:就是暴力的计算每个节点要替换的值,一次存入list中,然后再遍历list,将二叉树的值替换。方法二;因为是二叉搜索数,所以其要加的值就是其右孩子的所有值+其父节点的右孩子的所有值。所以其递归顺序是右中左,反中序遍历。代码方法一:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNod原创 2022-05-06 20:57:43 · 405 阅读 · 1 评论