LeetCode 367.有效的完全平方数
LeetCode 209.长度最小的子数组
LeetCode 904.水果成篮
LeetCode 76.最小覆盖子串
?
1. 滑动窗口 —— 双指针再回顾,暴力解法再优化
此题可通过时间复杂度为 O(n^2) 的双循环暴力解法解决,外循环遍历终止位置,内循环遍历起始位置,定义一个过程变量(子序列长度)subLength ,用最终结果 result 与之相比,当找到符合条件最短的子序列时,跳出内循环,继续遍历。
滑动窗口的思想是:不断调整子序列的起始位置和终止位置,外循环遍历终止位置,内循环设置好结束条件(依题而定),调整起始位置。注意返回结果 result 与中间变量 subLength 的比较,注意变更子序列的起始位置时还要变更结束条件变量的值。
?
2. 水果成篮
用到了 Map ,结束条件为 HashMap 的 size > 2 ,注意在值减到 0 时需要删除该键值对。
class Solution {
public int totalFruit(int[] fruits) {
int slow = 0;
int fast = 0;
int result = 0; // 水果的最大数目
HashMap<Integer, Integer> hs = new HashMap<Integer, Integer>();
for (; fast < fruits.length; fast++) {
int val = hs.get(fruits[fast]) == null ? 0 : hs.get(fruits[fast]);
hs.put(fruits[fast], val + 1); // 如果是第一次添加为空会报错
while(hs.size() > 2) {
hs.put(fruits[slow], hs.get(fruits[slow]) - 1);
if (hs.get(fruits[slow]) == 0) {
hs.remove(fruits[slow]);
}
slow++;
}
result = Math.max(result, fast - slow + 1);
}
return result;
}
}
?
3. 最小覆盖子串没有刷到,待我刷完补上
浅看一下仍旧需要用到 Map,保存字符和其出现次数。
LeetCode 59. 螺旋矩阵II
LeetCode 54. 螺旋矩阵
LeetCode LCR 146. 螺旋遍历二维数组
?
区间定义很重要
对于方阵,写个相应循环次数的外循环,设置好上下左右内循环边界,分四步:左→右,上→下,右→左,下→上,转圈圈。对于边为奇数的情况,需要单独给矩阵最中间的位置赋值,在外面再次判断赋值。
对于长方形矩阵,我们无法在单独给矩阵中间位置赋值,因为很难判断中间位置没有元素,是单个元素,还是一行或一列元素。因此我们需要把全部的赋值放到循环里,设置四个边界变量:left, right, top, bottom。外循环写 while(true)即可,这样内循环什么时候添加完数据,什么时候就可以 break 了。
感觉自己没有建立起这样的逻辑思维。