Day01数组

977 有序数组的平方

1.此题唯一的难点就是如何判断负数的平方,所以通过数组开头和数组结尾不断的比较,因为是有序数组,如果负数的平方比结尾的大,就将平方的值放到结尾,然后依次比较,最后得出的就是平方后的有序数组

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k=nums.size();
        vector<int>result(k);
        for(int i=0, j=k-1,pos=k-1;i<=j;)
        {
            if(nums[i]*nums[i]>nums[j]*nums[j])
            {
                result[pos]=nums[i]*nums[i];
                ++i;
            }
            else{
                result[pos]=nums[j]*nums[j];
               --j;
            }
            --pos;

        }
        return result;

    }
};

209长度最小的子数组

1.不断累加数值,如果总和大于或等于目标值,则取目标值长度为end-start+1,然后减去开头的数直到sum总值小与target,min取得的是最短的符合目标值的长度

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n=nums.size();
        if(n==0)
        {
            return 0;
        }
        int ans=INT_MAX;
       int start=0,end=0;
       int sum=0;
       while(end<n)
       {
        sum+=nums[end];
        while(sum>=target)
        {
            ans=min(ans,end-start+1);
            sum-=nums[start];
            start++;
        }
        end++;
       }
       return ans==INT_MAX?0:ans;
    }
};

59螺旋矩阵

 1.因为我们已知我们要生成n*n的矩阵,所以我们要绕n/2圈,如果是奇数就在最后面的中心点min补上最后的数

2整个螺旋矩阵由四个循环组成,x指针和y指针控制分别通过循环控制填入坐标,循环的大体内容分为四种

第一种:(j=starty;j<n-offset;j++)

从x轴开始累加到n-1,也就是边界,每转完一圈边界就减一

第二种:(i=startx;i<n-offset;i++)

从y开始累加n-1

第三种:(;j>starty;j--)

从x轴边界开始位置递减

第四种:(;i>startx;i--)

从y轴边界开始递减

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>res(n,vector<int>(n,0));
        int startx=0,starty=0;
        int loop=n/2;
        int mid=n/2;
      int   count=1;
        int offset=1;
        int i,j;
        while(loop--)
        {
            i=startx;
            j=starty;
            for(j=starty;j<n-offset;j++)
            {
                res[startx][j]=count++;
            }
             for(i=startx;i<n-offset;i++)
            {
                res[i][j]=count++;
            }
            for(;j>starty;j--)
            {
                res[i][j]=count++;
            }
            for(;i>startx;i--)
            {
                res[i][j]=count++;
            }
            starty++;
            startx++;
            offset+=1;
          
        }

          if(n%2)
            {
                res[mid][mid]=count;
            }
        return res;

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值