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

文档讲解:双指针(左右指针),滑动窗口

977.有序数组的平方

添加链接描述

平方后,数组由两端向中间递减,所以用双指针从两端开始比较得到从大到小的序列

双指针:左闭右闭

//双指针:左闭右闭
class Solution {
public:
    vector sortedSquares(vector& nums) {
        vector newV(nums.size());
        //左闭右闭
        int left = 0, right = nums.size()-1;
        int index = nums.size()-1;
        for(int i = 0; i < nums.size(); i++){
            nums[i] = nums[i]*nums[i]; 
        }
        while(left <= right){
            if(nums[left] <  nums[right]){
                newV[index--] = nums[right];
                right--;
            }
            else{
                newV[index--] = nums[left];
                left++;
            }
        }
        return newV;
    }
};

双指针:左闭右开

class Solution {
public:
    vector sortedSquares(vector& nums) {
    
		vector newV(nums.size());
        //左闭右开
        int left = 0, right = nums.size();
        int index = nums.size()-1;
        for(int i = 0; i < nums.size(); i++){
            nums[i] = nums[i]*nums[i]; 
        }
        while(left < right){
            if(nums[left] <  nums[right-1]){
                newV[index--] = nums[right-1];
                right--;
            }
            else{
                newV[index--] = nums[left];
                left++;
            }
        }
        return newV;
    }
};

209.长度最小的子数组

题目链接

  1. 初步想法:滑动窗口
  2. 遇到的困难:刚开始不能理解右进左出,左指针如何根据右指针的遍历结果来对数组进行操作

滑动窗口

滑动窗口的思想是:右进左出,右指针向前遍历数组,左指针根据右指针的遍历结果来对数组进行操作。

class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
        
        int left = 0, right = 0;
        int minLen = nums.size()+1;
        int sum = 0;
        for(right; right < nums.size(); right++){
            sum += nums[right];
            while(sum >= target && left <= right) {
                minLen = minLen > right - left+1 ? right - left+1:minLen;
                sum -= nums[left];
                left++;
            }
        }
        if(minLen == nums.size()+1) return 0;
        return minLen;
    }
};

59.螺旋矩阵II

题目链接

  1. 初步想法:双指针,但完全不知道怎么模拟
  2. 模拟顺时针画矩阵的过程:填充上行从左到右,填充右列从上到下,填充下行从右到左,填充左列从下到上(关键确定是每圈的初始位置和每圈的四条边长度,然后坚持循环不变量原则)
class Solution {
public:
    vector> generateMatrix(int n) {
        int num = 1;
        vector> mV(n,vector(n));
        int startx = 0, starty = 0;
        int loop = 0;
        int i, j;
        while(loop < n){
            loop++;
            i = startx;//每圈的初始位置
            j = starty;
            for(;j <= n-loop; j++){//注意最后一次循环后j++, j=n-loop+1
                mV[i][j] = num++;
            }
            j--;i++;
            for(;i <= n-loop; i++){
                mV[i][j] = num++;
            }
            i--;j--;
            for(;j >= starty; j--){
                mV[i][j] = num++;
            }
            j++;i--;
            for(;i > startx; i--){
                mV[i][j] = num++;
            }
            startx++;
            starty++;
        }
        return mV;
        
    }
};

收获

滑动窗口:右进左出,左指针如何根据右指针的遍历结果来对数组进行操作
螺旋矩阵:关键是确定每圈的初始位置和每圈的四条边长度,然后坚持循环不变量原则。

你可能感兴趣的:(代码随想录算法训练营每日笔记,算法,c++)