代码随想录Day2 :977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵Ⅱ

刷力扣,对于vector数组的声明定义,要学习一下。
一维数组

vector<int>nums;//不指定长度
vector<int>nums(n); // 指定长度为n

二维数组

创建m*n的二维vector:
vector<vector <int> >nums(m ,vector<int>(n)); //m*n的二维vector

977有序数组的平方
一开始暴力解法,先赋值,再冒泡排序,超时。

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

因此换一个思路。因为数据升序,俩边的数据平方会很大,中间数据最小。因此俩头归并,双指针算法。申请一个新数组放排好的元素。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n=nums.size();
        vector<int> res(n);
        int k=n-1;
        for(int i=0,j=n-1;i<=j;)//注意此时i<=j
        {
            if(nums[i]*nums[i]>=nums[j]*nums[j])//等号切记
            {
                res[k]=nums[i]*nums[i];
                k--;
                i++;
            }
            else
            {
                res[k]=nums[j]*nums[j];
                k--;
                j--;
            }
        }
        return res;
    }
};

59螺旋矩阵||
经典题型,注意起始点,四个方向的偏移量使用,以及边界点判定。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int dx[4]={0,1,0,-1};//
        int dy[4]={1,0,-1,0};
        vector<vector<int>> matrix(n,vector<int>(n));
        int x=0,y=0,d=0;
        for(int i=1;i<=n*n;i++)
        {
            matrix[x][y]=i;
            int a=x+dx[d];//注意a,b是下一步坐标,合法了赋值给x,y
            int b=y+dy[d];
            if(a<0||a>=n||b<0||b>=n||matrix[a][b])//等于n也不行
            {
                d=(d+1)%4;//取模别忘了加1
                a=x+dx[d];
                b=y+dy[d];
            }
            x=a;
            y=b;

        }
        return matrix;

    }
};

209长度最小的子数组听了carl哥的课才有思路。思路可以理解,但是实现细节感觉比较吃力。调试了好久才明白。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {

        int sum=0;
        int i=0,res=INT_MAX;
        for(int j=0;j<nums.size();j++)//j是终止边界
        {
            sum=sum+nums[j];
            while(sum-nums[i]>=target)//滑动窗口改变起始边界的精髓,削减冗余
            {
                sum=sum-nums[i];
                i++;
            }
            //cout<<i<<" "<<j<<endl;
            if(sum>=target)res=min(res,j-i+1);//要有if,满足>=target的条件。经过测试,判断条件是防止刚开始sum太小,但是改变了res,后面就一直是最小的res
            //cout<<res<<endl;
        }
        if(res==INT_MAX) return 0;
        else return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值