代码随想录算法训练营第2天

977. 有序数组的平方

  • 抓住题目特点,有序数组的平方,所以最大值出现在最左边或者最右边
  • 双指针法,指向指针的开头和结尾,比较哪个值更大,然后放到新数组里,再移动
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> res(nums.size(),0);
        int k=nums.size()-1;
        int st=0,ed=nums.size()-1;
        while(st<=ed){//<=要注意
            if(nums[st]*nums[st]>nums[ed]*nums[ed]){
                res[k]=nums[st]*nums[st];
                k--;
                st++;
            }
            else{
                res[k]=nums[ed]*nums[ed];
                k--;
                ed--;
            }
        }
        return res;
    }
};

209. 长度最小的子数组

  • 可以直接暴力,两层循环嵌套,复杂度高
  • 滑动窗口法(可以理解为动态的双指针,但是更关注的是两个指针中间即窗口的部分)
  •  三点:窗口内,如何移动起始位置,如何移动结束位置
    
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int res=INT32_MAX;
        int len,sum=0,st=0,ed=0;
        for(;ed<nums.size();ed++){//只用了一层循环,怎么确定的结束位置作为循环条件
            sum+=nums[ed];
            while(sum>=target){
                len=ed-st+1;
                res=res<=len?res:len;
                sum-=nums[st];
                st++;
            }
        }
        if(res==INT32_MAX)
            return 0;
        else return res;
    }
};

59. 螺旋矩阵 II

  • 模拟,用到了二分法的循环不变量思想(什么在变,什么不变)
    本题,从左往右,从上至下,从右往左,从下到上,顺序是不变的

  • 设置好几个需要用到的变量:循环次数,每次循环一条边的边上数的个数,每次循环的起始位置,考虑n的奇偶性

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        int loop=n/2;
        int startx=0,starty=0;
        int offset=1;
        int i,j;
        int num=1;
        while(loop--){
            for(i=startx,j=starty;j<n-offset;j++){
                res[i][j]=num;
                num++;
            }
            for(;i<n-offset;i++){
                res[i][j]=num;
                num++;
            }  
            for(;j>startx;j--){
                res[i][j]=num;
                num++;
            }
            for(;i>starty;i--){
                res[i][j]=num;
                num++;
            }
            i=startx++;
            j=starty++;
            offset++;//第一遍写的时候,offset没有自加,导致遍历多了,数组值被替换,值变大了
        }
        if(n%2!=0)
            res[n/2][n/2]=n*n;  
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值