代码随想录算法02 | LC977、209、59

Leetcode977.有序数组的平方

题目链接:

[977. 有序数组的平方 - 力扣(Leetcode)]

思路:

  • 暴力法
    • 一次循环将数组每个元素平方处理
    • 使用sort函数对数组排序
  • 双指针法
    • 新建一个数组储存排序后的元素
    • 在原数组头尾分别设指针
    • 两端比较 较大的 赋值为新数组末尾 同时指针移动

做题疑问:

  • 双指针法要是较小的赋值在新数组头部可行与否?
    • 不可行
    • 原因:原数组存在负数,负数的平方可能值很大即原数组两端的平方只可能为最大值,这也导致我们一定要从大向小完善新数组

法一:暴力

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

法二:双指针

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

Leetcode209. 长度最小的子数组

题目链接:

[209. 长度最小的子数组 - 力扣(Leetcode)]:

思路:

  • 滑动窗口
    • 其实也是某种意义上的双指针
    • 先记录前x个元素之和,一旦满足大于等于target,就开始从头缩减窗口大小直至不满足大于等于target,记录此时极限的窗口大小
    • 一整次循环后得出最小的窗口
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int res=1000000;
        int i=0;
        int sum=0;
        int length=0;
        for(int j=0;j<nums.size();j++)
        {
            sum+=nums[j];
            while(sum>=target)
            {
                length=j-i+1;
                res = res<length?res:length;
                sum-=nums[i];
                i++;
            }
        }
        if(res!=1000000)
            return res;
        else
            return 0;
    }
};

Leetcode59. 螺旋矩阵 II

题目链接:

[59. 螺旋矩阵 II - 力扣(Leetcode)]

思路:

  • 模拟

    • 注意循环的细节

    • 可以发现n/2即为要走的圈数

    • 采用二维数组(类比平面直角坐标系),从(0,0)开始绕圈,直至中心
      代码随想录算法02 | LC977、209、59_第1张图片

    • 走第二圈时 起始点++变为(1,1),以此类推

    • 注意,若n为奇数,中心点须单独赋值

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> arr(n,vector<int>(n,0));
        int x=0,y=0;//起始点
        int offset=1;//留一个
        int count=1;
        int loopCount=n/2;//循环次数
        int arrMid=n/2;//中心点
        int i,j;
        while(loopCount--)
        {
            for(j=y;j<n-offset;j++)
            {
                arr[x][j]=count++;
            }
            for(i=x;i<n-offset;i++)
            {
                arr[i][j]=count++;
            }
            for(;j>y;j--)
            {
                arr[i][j]=count++;
            }
            for(;i>x;i--)
            {
                arr[i][j]=count++;
            }
            x++;
            y++;
            offset++;
        }
        if(n%2)
        {
            arr[arrMid][arrMid]=count;
        }
        return arr;
    }
};

总结

今天比昨天费时耗力一些,做题思路很差,只能想到暴力,好在看完讲解后能够理解并自己完成,明天继续!

收获:

  • sort函数使用:它有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,如果不写的话,默认从小到大进行排序。
  • vector声明数组:vector<元素类型>数组对象名(数组长度,元素初值);
  • vector声明数组:vector<元素类型>数组对象名(数组长度,元素初值);
  • vector声明二维数组:vector> matrix(m, vector(n, 0));

你可能感兴趣的:(代码随想录,算法,leetcode,数据结构)