代码随想录算法训练营第二天| 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

第二天

题目

977
209
59

对题目的想法

有序数组的平方螺旋矩阵感觉比较轻松,长度最小的子数组感觉有点犯难,因为滑动窗口的条件忘了。

实现中/后的感想

最麻烦的果然是滑动窗口,费时没有留意,可能在半小时到一小时之间。
这是本猪最终通过的解法:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0;
        int slow = 0;
        int fast = 0;
        int result = 0;
        while (fast < nums.length) {
            sum = sum + nums[fast];
            if (sum < target) {
                fast++;
            }
            else {
                while (slow <= fast) {
                    sum = sum - nums[slow];
                    if (sum < target)
                        break;
                    else {
                        slow++;
                    }
                }
                if (result == 0)
                    result = fast - slow + 1;
                else
                    result = result < fast - slow + 1 ? result : fast - slow + 1;
                slow++;
                fast++;
            }
        }
        return result;
    }
}
  • 滑动窗口困难点:
  1. result初始赋值为0,在第一次检测到有一个符合条件的子序列时应该直接覆盖这个初始值
if (result == 0)
	result = fast - slow + 1;
else
	result = result < fast - slow + 1 ? result : fast - slow + 1;

这一步一开始忘记了。
2. 当记录了一个新的result之后两个指针都要往前进。

  • 螺旋矩阵:
    对一个二维或者高维矩阵初始化,其实并不熟悉。在网页版编译器中稍微测试了一下才发现可以直接初始化一个高维数组。

看完代码随想录之后的想法

感想主要还是在滑动窗口的应用:

  1. 关于滑动窗口的返回值,可以初始赋值一个特别大的数,比如INTMAX,随后就不用多此一举写一个条件控制了。
  2. 毫无疑问随想录的解法更为优雅简洁。本猪在实现时有点犹豫,sum要不要第一时间加上快指针所在的值,导致后面的条件判断十分丑陋。

数组部分的总结

  1. 最重要的还是条件判断,也就是随想录所说的开区间和闭区间的取舍。这一点有时仅靠猪眼观察可能很容易出错,必须用纸笔演示才能发现。然鹅本猪太懒,不想动手写字,于是就降低了学习效率。
  2. 要看清题目条件,细读要求。这一点恐怕也不止适用于数组。

杂项

顺手又做了一下螺旋矩阵, 大部分内容和sqaure matrix类似,难点在于非平方矩阵最后的补充。

		if (len < wid && len % 2 == 1) { //in the mid column, from up to down
            for (int i = loop; i < wid - loop; i++)
                res.add(matrix[i][loop]);
        }
        else if (wid < len && wid % 2 == 1) { // in the mid row, from left to right
            for (int i = loop; i < len - loop; i++)
                res.add(matrix[loop][i]);
        }
        else if (wid == len && wid % 2 == 1) {
            res.add(matrix[loop][loop]);
        }

这里条件控制为 (i < wid - loop), 而在内部的大循环里面为 (i < wid - loop - 1)。
从下周起又要开始忙了,不知道本猪能花多长时间专注在编程上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值