DAY2:leetcode977有序数组的平方 209 长度最小的子数组 59螺旋矩阵

一、双指针法 O(n)时间复杂度:有序数组的平方

一维数组初始化:

vector<int> V (m,n)

m指有多少个n, 即数组容量,n为初始化的赋值。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
    int k=nums.size()-1;
    vector<int> result(nums.size(),0); //一维数组初始化,细看! lc给出的样板文件是&引用的意思
    for(int i=0,j=nums.size()-1;i<=j;){ //int i, int j; i<=j报错 不可写两遍int
        if(nums[i]*nums[i]>nums[j]*nums[j]){
            result[k--]=nums[i]*nums[i];//等效写法 result[k]=nums[i]*nums[i];k--
            i++;
        }
        else{
            result[k--]=nums[j]*nums[j];
            j--;
        }
    }
    return result;//第一遍写了result[k],事实上应该返回整个数组
    }
};

二、滑动窗口 双指针:长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int i=0;
        int sum=0;
        int sublength=0;//更新的滑动窗口的长度
        int result=INT32_MAX;//WHY?  why not result=nums.size() 给一个极大值
        for(int j=0;j<nums.size();j++){//这里漏写j=0执行错误
            sum+=nums[j];
            while(sum>=target){
                sublength=(j-i+1);
                result=(result<sublength)?result:sublength;//min(result,sublength)
                sum-=nums[i++];//实际上要一直循环下去
            }
        }
        return result==INT32_MAX?0:result; //确定是否返回0,如果result没有被赋值 没有进入过while循环
    }
};

三、循环判定的边界条件:螺旋矩阵

二维数组初始化:

vector<vector<int>> result(n,vector<int>(n,0));   n行*n列

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n,vector<int>(n,0));
        int startX=0,startY=0;//每一次左上角转圈的起始点
        int offset=1;//每一圈往内缩进
        int count=1;//每个方格内按序填充的值
        int i,j;//每个网格的坐标点,以数组的0,1,2,3开始编
        int loop=n/2;
        while(loop--){//没有写--循环卡死
            i=startX;
            j=startY;
            for(j=startY;j<n-offset;j++){//第一次写没有把startX,Y放入循环见鬼
                result[startX][j]=count++;
            }
            for(i=startX;i<n-offset;i++){
                result[i][j]=count++;
            }
            for(;j>startY;j--){//这里弄混了startY,j&startY
                result[i][j]=count++;
            }
            for(;i>startX;i--){//这里弄混了startX,j&startX
                result[i][j]=count++;
            }
            startX++;
            startY++;
            offset++;
        }
        if(n%2==1){
            result[n/2][n/2]=count;//最后一个count赋值 先加后赋值 和++i不同 这里写[i][j]循环错误
        }
        return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值