【代码随想录第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵】

977.有序数组的平方

思路

这道题在做完第一遍后意识到了该数组的平方和(原顺序)下可能是一个先递减后递增的数组(满足有负数,且abs(最大的复数)>最小的正数),因此即刻联想到了双指针分别指向数组头和尾,比较,填充,移位三步操作

代码随想录

for 循环的循环变量的自增自减的位置很灵活,要根据目的确定

代码

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> results(nums.size(), 0);
        int left = 0;
        int count = nums.size() - 1;
        for (int right = nums.size() - 1; right >= left;) {
            if (nums[left]*nums[left] >= nums[right]*nums[right]) {
                results[count--] = nums[left]*nums[left];
                left++;
            }
            else  {
                results[count--] = nums[right]*nums[right];
                right--;
            }
        }
        return results;
    }
};

209.长度最小的子数组

思路

最开始想到的方法为暴力解法,两层for 循环嵌套,分别记录子数组的起始点和终止点;
result = result < subLength ? result : subLength; 一旦找到短的子序列就break 出第二层终止点的循环,开始改变子数组的起始点

代码随想录

滑动窗口在当时第一遍学的时候印象很深刻,但没有掌握最重要的
sum -= nums[i++]; // 滑动窗口的精髓之处,不断变更(子序列的起始位置)
这样就只需要一个for 循环记录滑动窗口的终止位置即可。

收获

  • 滑动窗口
  • int result = INT32_MAX 利用这段位置可以判断在程序中是否对result进行了赋值.
class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; // 滑动窗口数值之和
        int i = 0; // 滑动窗口起始位置
        int subLength = 0; // 滑动窗口的长度
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            // 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
            while (sum >= s) {
                subLength = (j - i + 1); // 取子序列的长度
                result = result < subLength ? result : subLength;
                sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;

59.螺旋矩阵

思路

  1. 首先需要判断给出正整数n后,生成正方形矩阵时需要转几圈,以圈数作为外层循环
  2. 内层4组for循环分别从正方形框的四条边开始,这里在循环时需要设计一个offset,因为每个for循环不是循环到正方形的顶点
    在这里插入图片描述
    3. 四组for循环结束后,对startX, startY, offset都加一,代表下一层loop的起始位置变化以及for循环终止条件的变化
    4. n为奇数时为特殊情况,中间层只有一个数字,需要单独加一段代码逻辑处理;

代码随想录

在对vector<vector<int>> res(n, vector<n, 0>) 初始化时险些出错了

收获

二维数组的初始化方式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值