代码随想录算法训练营第二天 | 滑动窗口、模拟行为

发布时间:2024年01月12日


今天感觉难度飙升,耗时好久好久,还有两个拓展题没有刷到…

滑动窗口 双指针

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 了。


今日总结

感觉自己没有建立起这样的逻辑思维。

文章来源:https://blog.csdn.net/SUburbuia/article/details/135537989
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。