算法训练第二天|977.有序数组的平方、209.长度最小的有序数组、59.螺旋矩阵2

这篇具有很好参考价值的文章主要介绍了算法训练第二天|977.有序数组的平方、209.长度最小的有序数组、59.螺旋矩阵2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

977.有序数组的平方

题目链接:力扣

思路:同样使用双指针的方法,这样就可以只遍历一次原数组。

可以考虑需要按照一个顺序来遍历,那就是从大到小或者从小到大,我选择的是从大到小。

不难看出,原数组将每个数平方后,呈现从两边到中间逐渐减小的规律。

所以使用一个指针指向原数组最左端,一个指向最右端,比较那边的数大,就是原数组中最大的数。

我们新建一个数组,用来存放已经排好序的数组,按照从大到小放数据应该是从数组尾开始放。

时间复杂度:o(n)

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        //这个个地方用.size()函数来求数组的长度,注意是vector数组的函数方法
        int len=nums.size();
        for(int i=0;i<len;i++) nums[i] = nums[i]*nums[i];
        //需要注意这里vector数组的定义方法,不会就搜索一下
        vector<int> numss(len);
        //这里使用双指针i,j来遍历原数组
        //同时用一个指针来完成将数据放入排序好的数组
        int i=0,j=len-1,k=len-1;
        //这里每个人可以根据个人喜好使用不同的循环语句,for循环也可以做到
        while(true){
            if(nums[i]<nums[j]){
                numss[k]=nums[j];
                j--;
            }
            else{
                numss[k]=nums[i];
                i++;
            }
            k--;
            if(k<0) break;
        }
        return numss;
    }
};

 本题的难点在于如何考虑到只用时间复杂度为o(n)的方法,即只遍历一次原数组,需要根据平方后的原数组找到按从大到小或从小到大的规律。

209.长度最小的子数组

题目链接:力扣

思路:使用滑动窗口的方法,我们可以想到子序列的变化方法就是,当子序列之和大于目标值,就要从开头减去一个,小于目标值时,就要从后面再添加进一个。

但是我们要考虑所有子序列的可能性,即所有的数组元素都可能成为子序列的开头或结尾,当我选择子序列是从左往右滑动时,那么子序列的结尾是规律的,即每次添加一个元素。

而对应于每个子序列的结尾,子序列的开头可以是在这之前的任意一个元素,但实际上却并不用考虑在这之前的每个元素,因为当结尾在往右遍历时,开头也在往右遍历,我们只需考虑当前开头的后面元素,而不必考虑当前开头的之前元素。

时间复杂度:nlogn 

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        //用result来表示最短子序列的长度,先将其赋值为整形最大值是考虑到每次都是按子序列长度更小的进行赋值,本题中数组可能不存在满足条件的子序列,则result没有被赋值,输出0;
        int result = INT_MAX;
        //用sum来表示当前子序列内所有数的和
        int sum=0;
        //用i来表示子序列开头的位置
        int i=0;
        for(int j=0;j<nums.size();j++){
            //j是用来表示子序列结束的位置,因为我们考虑到数组的每个元素都有可能成为子序列的结束位置。
            sum+=nums[j];
            //当添加一个元素进去后,那么子序列的总和就有可能超过目标元素,此时我们需要将子序列中元素减去一个,很显然就是从开头减去,因为子序列是连续的。
            while(sum>=target){
                //len表示子序列的长度
                int len=j-i+1;
                //此时result是表示所有满足条件的自序中长度最小的,所以它是一个要和所有长度比较的变量,遇到更小的就赋值。
                result=result>len?len:result;
                sum-=nums[i];
                i++;

            }
        }
        return result==INT_MAX?0:result;

    }
};

滑动窗口的运用让我想到字符串匹配是不是也可以用这种方法?只要是连续的子序列仿佛都可以用。 

 59.螺旋矩阵2

题目:力扣

思路:数组里的题最难的就是找出规律,当规律被发现了,答案也就浮出水面了。

看到这题,相信每个人都能想到,需要四条边逐边进行赋值,那么比较难的就是进行四条边的规律统一,首先找到的就是每四条长度相等的且互相不重复的边可以构成一个完整的圈,每条边包含一个拐点。

首先思考每次循环一圈的起点在哪里,自己在纸上写一个n=5比较大的循环,就可以发现每次的起点在数组的主对角线上。此处需要一个变量来表示。

其次我们也观察到,每一圈每一条边需要赋值的元素都在减少一此处也需要一个变量表示。但我没用这个变量表示每条边需要走的步数,而是用每圈右边界少抵达的坐标来表示。这样间接可以用起点减去这个边界来表示要走的步数。

最后发现,当n为奇数时,所有的圈走完,还剩中心一个元素没有赋值,我们需要单独为它赋值。 

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        //用来表示每圈的起点坐标
        int starti=0,startj=0;
        //key用来控制需要循环几圈
        int key=n/2;
        //count用来表示需要填入数组的数1,2,3,4...
        int count=1;
        //用来控制左右边界需要收缩多少,每次循环右边界多收缩一位,从第二次循环开始左边界收缩一位,其实就是每次循环,一条边走几步
        int bianjie=1;
        while(key--){
            int i=starti,j=startj;
            for(;j<n-bianjie;j++) res[i][j]=count++;
            for(;i<n-bianjie;i++) res[i][j]=count++;
            for(;j>startj;j--) res[i][j]=count++;
            for(;i>starti;i--) res[i][j]=count++;
            starti++;
            startj++;
            bianjie++;
        }
        if(n%2==1) res[starti][startj]=count;
        return res;
    }
};

本题难点在于找到规律,和寻找自己需要表示的变量,应该不用自己想出来怎么写,只要看懂别人的思路,然后自己能敲出来代码,以后碰到类似的题能想起来这个思路就行。 文章来源地址https://www.toymoban.com/news/detail-421438.html

到了这里,关于算法训练第二天|977.有序数组的平方、209.长度最小的有序数组、59.螺旋矩阵2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Day 2 数组:977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵Ⅱ

    977.有序数组的平方 题目链接 💡思路 暴力解法 将数组内每个数平方每个数平方之后,按升序排序 代码如下: 时间复杂度: O (   n l o g n ) O( nlogn) O (   n l o g n ) 空间复杂度: O ( 1 ) O(1) O ( 1 ) 时间复杂度具体分析: for循环: O(n) 快速排序 : O(nlogn) 因此时间复杂度是 O (  

    2024年02月10日
    浏览(52)
  • Day02 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

    https://leetcode.cn/problems/squares-of-a-sorted-array/ 时间复杂度O(n) https://leetcode.cn/problems/minimum-size-subarray-sum/ 时间复杂度:O(n) 看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。 空间复杂度

    2023年04月18日
    浏览(40)
  • Leetcode 977-有序数组的平方 | LeetCode209-长度最小的子数组 | Leetcode59-螺旋矩阵

    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 思考: 这个数组为有序数组,那么即使前面有负的,数组平方的最大值只能是在数组的倆端,不是在左边就是右边,不可能是在中间 由此想到双指针做法,left从

    2024年02月16日
    浏览(48)
  • 代码随想录Day02:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    977.有序数组的平方 【 题目建议 】: 本题关键在于理解双指针思想 【随想录文章讲解】 【卡哥视频讲解】 方法一:暴力排序法 **思路:**先对数组中每个数进行平方运算,然后再排序 时间复杂度是 O(n + nlogn) 其中包括计算平方数组的O(n)和快速排序的O(nlogn),总体上是O(nlo

    2023年04月27日
    浏览(54)
  • LeetCode-Day2-977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,

    双指针法,原来数组是有序的,说明平房之后最左和最右两边的平方和是最大的,比较最大的插入新的vector数组,然后移动指针选下一个元素进行比较。 接下来就开始介绍数组操作中另一个重要的方法: 滑动窗口 。 所谓滑动窗口, 就是不断的调节子序列的起始位置和终止

    2024年02月16日
    浏览(46)
  • day2-数组part02| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II

    数组平方后的最大值只可能在数组两端,不可能在中间 设置双指针,比较两个指针所指值的大小,记录较大值,接着向中间移动这个指针 结束条件:左右指针相背 暴力一直不过,明天再补一下 不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。 思路 子数

    2024年02月02日
    浏览(32)
  • 【LeetCode题目详解】 977.有序数组的平方 209.长度最小的子数组59.螺旋矩阵II day2

    看完这个题目第一想法就是直接暴力解决,直接将全部平方然后进行排序。比如快排。 代码如下: 时间复杂度是 O(nlogn)或者说【O(n + nlogn)】,括号里面这个是为了比较接下来的方法。 然后看了代码随想录的视频学习了用双指针来写这道题的方法(说实话不看视频真没想到可

    2024年02月13日
    浏览(43)
  • 【力扣】977. 有序数组的平方 <首尾指针>

    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入 :nums = [-4,-1,0,3,10] 输出 :[0,1,9,16,100] 解释 :平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100] 示例 2: 输入 :nums = [-7,-3,2,3,11] 输出

    2024年02月14日
    浏览(30)
  • 算法-有序数组的平方,长度最小的子数组,螺旋矩阵II

    伪装成一个老手! 题目 给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 示例 : 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100] 来源:力扣977 思路 遍

    2024年02月11日
    浏览(43)
  • LeetCode每日一题【977. 有序数组的平方】

    题目: 思路: 直接每个元素平方,然后排序,比较简单 双指针,一头一尾,每次比较头指针元素平方与尾指针元素平方的大小,若头指针的元素平方比较大,则头指针往后移动,否则尾指针往前移动

    2024年02月20日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包