重生之我在秋招写代码Day2

1. 有序数组的平方

力扣题号:977.有序数组的平方
还是双指针,但是最重要的一定是left <= right,因为要处理最后一个元素。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(), 0);
        int left = 0, right = nums.size() - 1;
        int k = result.size() - 1;
        while (left <= right) {  // 注意这里一定要left <= right, 要不最后一个元素处理不了
            if(abs(nums[left]) > abs(nums[right])) {
                result[k--] = (nums[left] * nums[left]);
                left++;
            }
            else {
                result[k--] = (nums[right] * nums[right]); 
                right--;
            }
        }
        return result;
    }
};

2. 长度最小的子数组

力扣题号:209. 长度最小的子数组
还是双指针,其实这道题有了思路就很好做了。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int slow = 0, fast = 0;
        int sum = 0;
        int minLength = INT32_MAX;
        while (fast < nums.size()) {
            sum += nums[fast];
            fast++;
            while (sum >= target) {
                sum -= nums[slow];
                slow++;
                minLength = (fast - slow + 1) < minLength ? (fast - slow + 1) : minLength; // 另外注意这里fast - slow + 1
            }
        }
        if (minLength == INT32_MAX) return 0; // 这里经常会漏,注意要加上是否存在这样的数组
        return minLength;
    }
};

3. 螺旋矩阵 II

力扣题号:59. 螺旋矩阵 II
这里我用的方法跟代码随想录的可能不太一样,我自己觉得这个在面对非方阵时也是同样的方法,思路也会清晰一点。
这个做法最容易错的地方在于自增/自减顺序与>>=的匹配。**自增在前无等号,自增在后有等号!**这个题一定要反复看,现已加入豪华复习套餐。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n, vector<int>(n, 0)); // 注意:这里别漏了把矩阵形状先声明出来,虽然很低级但是这也是犯过的错
        int left = 0, right = n - 1, top = 0, bot = n - 1; // 设置第一轮次要处理的边的位置
        int cnt = 1;
        while (true) {
            for (int i = left; i <= right; i++) { result[top][i] = cnt++; } // 遍历上边缘
            if (++top > bot) { break; } // 1. 注意这里:因为自增在前,所以一定要top一定要严格大于bot才能退出。
            // 如果++top >= bot的话,因为自增在前,top == bot时最中间那一行还没处理,会出现0.
            
            for (int i = top; i <= bot; i++) { result[i][right] = cnt++; }
            if (--right < left) { break; } // 2. 如果想用 <= 怎么办呢?很简单,把自增/自减运算放到判等之后。
            // 也即: right-- <= left,这样也是可以的

            for (int i = right; i >= left; i--) { result[bot][i] = cnt++; }
            if (--bot < top) { break; } // 3. 反正记住:自增在前无等号

            for (int i = bot; i >= top; i--) { result[i][left] = cnt++; }
            if (++left > right) { break; }
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值