- 博客(219)
- 收藏
- 关注
原创 LeetCode75. 颜色分类+LeetCode49. 字母异位词分组
LeetCode75. 颜色分类+LeetCode49. 字母异位词分组。
2022-06-07 19:48:07
167
原创 LeetCode11. 盛最多水的容器
思路用左右两个指针遍历数组,每次移动一个指针,另一个指针不动,每移动一次就计算一次容量。容量=(r-l)*min。左右指针最小值为min。此时基本思路已经知道了,就剩下指针如何移动了。无论是移动短板或者长板,我们都只关注移动后的新短板会不会变长,而每次移动的木板都只有三种情况,比原短板短,比原短板长,与原短板相等;如向内移动长板,对于新的木板:1.比原短板短,则新短板更短。2.与原短板相等或者比原短板长,则新短板不变,容量变小。所以,向内移动长板,一定不能使新短板变长。代码class S.
2022-05-31 19:52:46
109
原创 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
233
原创 LeetCode5. 最长回文子串
思路1.动态规划:用动态规划实现的。这个题和最长回文子串的长度的题很相似,就多了一个截取字符串的过程2.中心扩散就是遍历各个字符,以该字符为中心向其左右两边扩散。一次比较扩散后的两个元素是否相等。但是会有一种情况就是以两个元素为中心扩散的方式。所以要考虑两种情况。代码1.动态规划class Solution { public String longestPalindrome(String s) { if(s == null || s.length() ==
2022-05-27 20:17:00
80
原创 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
81
原创 LeetCode2. 两数相加
思路首先,要注意有进位的问题,进位的数字下一次计算也会计算,所以就用text来保存进位。在最后结束的时候,如果进位text不为空,还要在链表尾追加一个节点,其值为text。其次,两个链表的长度不一样,一个链表遍历完了,另一个没遍历完要补0.我这里没有补0节点,而是在计算值的时候用0代替。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode
2022-05-23 20:39:44
116
原创 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
179
原创 LeetCode239. 滑动窗口最大值
思路暴力解法会时间超时。所以就只能用单调队列来解决了。首先用数组来实现单调队列,定义一个数组,用来实现单调队列里面存放下标,head指向队列的头节点(且当前头结点在滑动窗口内),tail指向队列的尾结点。1.队列加入元素当队列要加入一个元素时,因为本题是单调递增的,所以在加入一个元素时,如果当前元素比队列尾部元素小,就直接加入;如果比尾部元素大,就把队列里所有比当前元素小的元素删除,然后将当前元素加入队列即可。2.判断窗口向前滑动当队列头指针指向的元素已经不在当前窗口内里就是窗口向后
2022-05-22 16:16:09
172
原创 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
102
原创 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
215
原创 LeetCode20. 有效的括号
思路首先要遍历字符串,没遍历一个字符就对其进行比较,如果是(、{、【其中的一个就将)、}、】压入栈中,如果都不是上面的三种情况,就将栈中的栈顶元素和当前的字符进行比较,如果一样就将栈顶元素弹出,不一样就返回false,代码class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for(int i =0
2022-05-17 20:08:31
163
原创 LeetCode51. N 皇后
思路首先要知道在棋盘的什么位子可以放置棋子。当前位子所在的列所在的行以及其所在的两个对角线如果有棋子存在就不能放了。所以isVaild()函数已经就是这样写的。然后就是回溯的一般步骤。需要注意的时,在放置棋子时,要进行判断,如果满足条件就放置,如果不满足就不放,并且回溯是在满足条件的基础上进行的(可以参照图片来理解)。代码随想录的图如下:代码class Solution { List<List<String>> res = new ArrayLis.
2022-05-16 21:41:14
111
原创 LeetCode47. 全排列 II
思路这个题和上一题的全排列不同的地方是有重复的数字。需要去重,这里去重有两种方法:一个是用set去重,一个将数组排序然后用used数组去重。重点说下用used数组去重:因为是排列问题,所以就要用used数组记录遍历的元素,而去重刚好也要记录遍历的元素,所以就二者合二为一了。首先对数组进行排序,当一个元素没有被使用的时候usede是false,被使用过后就是true,所以当nums[i-1] == nums[i] && used[i-1]==false时,表明该元素在.
2022-05-14 11:00:24
123
原创 LeetCode46. 全排列
思路每一个回溯算法都可以用树形结构来展示。如下是代码随想录的图从上面的图中不难看出,每次使用一个元素后就将其在used数组中进行标记,这个不是每一层一个used数组所以不需要在for循环上面重新new数组,这个是和递增子序列不同的地方。代码class Solution { List<Integer> path = new ArrayList<>(); List<List<Integer>> res = new Array.
2022-05-14 10:49:06
207
原创 LeetCode491. 递增子序列
思路首先该题是求递增子序列,那么就不能对数组进行排序。可以看下代码随想录的题解可以从上图看到每一层的元素不可以重复,而且原数组不能排序。所以就只能没一层插入一个元素就记录一个元素,到下一层循环的时候该层的记录就清空。这就是为什么要把userd数组在for循环上重新new一个的原因。代码class Solution { List<Integer> path = new ArrayList<>(); List<List<Integer&.
2022-05-14 10:07:56
313
原创 LeetCode90. 子集 II
思路方法一:本题和上一题的子集问题最大的不同就是有重复的数字,就需要去重。和之前的去重的一样的就是要先排序然后把结果用set保存。方法二: 用Boolean数组来解决,如果同一个树枝使用过是true,如果是同一个树层使用是false。代码用set处理class Solution { List<Integer> path = new ArrayList<>(); Set<List<Integer&g...
2022-05-13 20:22:36
270
原创 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
193
原创 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
253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人