代码随想录跟练日记|Day 2 数组part02

算法小白训练营日记,笔记为自用,若有错误感谢指出

--今日任务--:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 

977.有序数组的平方

题目链接:977. 有序数组的平方 - 力扣(LeetCode)

暴力方法:每个数都平方后再排序

快排函数:sort(A.begin(), A.end()); 

暴力方法代码如下:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        for (int i = 0; i < A.size(); i++) {
            A[i] *= A[i];
        }
        sort(A.begin(), A.end()); // 快速排序
        return A;
    }
};

 双指针法:数组左右两边平方后必定是最大的,左右两边数平方后比较大小放入新数组中,再将数组逆置即可。

vector容器定义数组:vector<int> newNums;

数组中按序定义元素:newNums.push_back(sLeft);

逆置数组中元素:reverse(newNums.begin(),newNums.end());

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int left=0,right=nums.size()-1;
        vector<int> newNums;
        while(left<=right){
            int sLeft=nums[left]*nums[left];
            int sRight=nums[right]*nums[right];
            if(sLeft>=sRight){
                newNums.push_back(sLeft);
                left++;
            }
            else{
                newNums.push_back(sRight);
                right--;
            }
        }
        reverse(newNums.begin(),newNums.end());
        return newNums;
    }
};

209.长度最小的子数组

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

具体思路:双指针设置滑动窗口,i为滑动窗口起始位置,j为窗口末尾位置,sum为窗口中元素总和,定义结果res为最大数。移动滑动窗口末尾位置,计算总和,若窗口内数值总和大于target,计算窗口内含有数值个数,比较res大小,更新结果,移动窗口起始位置,再次比较大小。重复上述步骤遍历数组,得到最小窗口大小,若都不满足题意,则res无法更新,依旧为最大数,则结果为0。

代码如下:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int i=0,sum=0,res=INT32_MAX,subLength=0;
        for(int j=0;j<nums.size();j++){
            sum+=nums[j];
            while(sum>=target){
                subLength=j-i+1;
                res=res<subLength?res:subLength;
                sum-=nums[i++];
            }
        }
        return res==INT32_MAX?0:res;
    }
};

59.螺旋矩阵II

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

思路:重点为边界问题,坚持循环不变量法则,按照左闭右开书写代码,定义starxtx,starty为每一层循环的起始位置,循环一圈后都+1,offset用于控制每条边遍历的长度,cnt为排序元素,loop循环次数,若n为奇数时,循环剩最后一个时单独赋值。

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

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值