Day 2 数组Part2

Leetcode: 977. 有序数组的平方

本题解题思路为双指针, left 指针需要,指向负数中的最大值的下标,而right指针需要指向非负数的最小值的指标。

同时需要注意条件left与right初始值,及while 循环条件。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
       vector<int>n;
       int l = -1;
       int r = nums.size() - 1;
       for (int i = 0; i < nums.size(); i++) {
            if (nums[i] < 0) {
                l = i;
            } else {
                break;
            }
       }

        r = l + 1;
        while(l >=0 || r < nums.size()) {
            if (l = -1) {
                n.push_back(nums[r] * nums[r]);
                r++;
            } else if (r == nums.size()) {
                n.push_back(nums[l] * nums[l]);
                l--;
            } else if (nums[l] * nums[l] < nums[r] * nums[r]) {
                n.push_back(nums[l] * nums[l]);
                l--;
            } else {
                n.push_back(nums[r] * nums[r]);
                r++;
            }
        }

        return n;
    }
};

leetcode:209. 长度最小的子数组

本题主要思路是滑动窗口,窗口右侧不断增加求和,当和大于目标值时需要不断缩小窗口左侧不断的保存窗口的最小值。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
       if (nums.size() == 0) return 0;
       int winl = 0;
       int winr = 0;
       int sum = 0;

       int minlen = INT_MAX;

       while (winr < nums.size() ) {
            sum += nums[winr];
            while(sum >= target){
                minlen = min(minlen, winr - winl + 1);
                sum -= nums[winl];
                winl++;
            }
            winr++;
       }

       return minlen == INT_MAX ? 0 : minlen;
    }
};

leetcode: 59. 螺旋矩阵 II

 需要记住一个重要点,就是左闭右开----假设一边有4个格子,那每操作一个边时只赋值前3个。

别忘了保存n,用于最后中心点的判断及赋值。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> matrix(n,vector<int>(n,0));
        int save = n;
        int startx = 0;
        int starty = 0;
        int num = 1;

        int loop = n/2;
        while(loop --) {
            int i = startx;
            int j = starty;

            //up
            for (i; i < n -1 ; i++) {
                matrix[j][i] = num;
                num++;
            }

            //right
            for(j; j < n -1; j++){
                matrix[j][i] = num;
                num++;
            }

            //down
            for(i; i > startx; i--) {
                matrix[j][i] = num;
                num++;
            }

            //left
            for(j; j > starty; j--) {
                matrix[j][i] = num;
                num++;
            }

            n--;
            startx++;
            starty++;
        }

        if (save % 2 !=0) {
            matrix[save/2][save/2] = num;
        }
        
        return matrix;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值