DAY2 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

一.LeetCode977.有序数组的平方 

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章讲解:代码随想录

视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili

自己想法:先用for循环将数组更新为平方数组,然后再用冒泡或者是快速排序

看完视频:恍然大悟,我没有观察到这个平方数组的规律,他是从两头往中间来递减(初始数组最左边可能是负数,其平方是绝对值的平方)这个规律用来使用双指针十分好用,用两个指针一个指向头,另一个指向尾,用这两个指针指向的数值来选择较大的一个数放入新数组,注意要重新开一个数组,使用空间换时间。并且,对于初始数组取平方这个步骤可以直接在双指针那层循环中直接进行。

二.LeetCode209长度最小的子数组

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章讲解:代码随想录

视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

自己想法:暴力搜索,用i来遍历起始点,缺点是每一次都要从新的起点开始重新计算

class Solution {

public:

    int minSubArrayLen(int target, vector& nums) {

        int i=0,j=0;

        int sum=0;

        int ans=INT_MAX;

        while(i//注意这里一定要将j

            sum+=nums[j];

            j++;

            if(sum>=target){

                sum=0;

                ans=min(ans,j-i);

                i++;

                j=i;

            }

        }

        return ans==INT_MAX?0:ans;

    }

};这样时间复杂度是o(n^2),只能过18个测试点,后面时间超限

看完之后:直接遍历终点,再从终点的位置往前面搜索,搜索最小的区间,这样减少数字和计算的次数。

三.59螺旋矩阵

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章讲解:代码随想录

视频讲解:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili

自己想法:这道题之前做过,所以能自己写出来; 

class Solution {

public:

    vector> generateMatrix(int n) {

            int loop=n/2+1;//表示多少圈

            int i,j;

            int num=1;

            vector > a(n,vector(n));//之前没有写这句话就报错了

            int l=0,r=n-1;//用来作为每一圈起始点和终点的参照位置

            while(loop){

                for(i=l;i

                a[l][i]=num++;

                for(i=l+1;i

                a[i][r]=num++;

                for(i=r-1;i>=l&&num<=n*num;i--)

                a[r][i]=num++;

                for(i=r-1;i>=l+1&&num<=n*n;i--)

                a[i][l]=num++;

                l++;

                r--;

                loop--;//圈数减一

            }

            return a;

    }

};

看完之后:我自己写的时候就是没有确定区间的不变量这个问题,所以四个循环会出现错乱,很乱,不容易修改,如果确定了左闭右开就更方便了。

你可能感兴趣的:(算法)