算法-有序数组的平方,长度最小的子数组,螺旋矩阵II

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

伪装成一个老手!

一、有序数组的平方

题目

给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 :

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

来源:力扣977

思路

遍历数组中的每一个元素,将其平方后放回原位,然后再对其进行排序。

阻碍

1. Q1:有序数组平方后,不一定是有序的了该怎么办?
A1:无序变有序的第一想法就是使用各种排序算法变成有序数组,但这样就忽略了题目中“有序数组”这个条件。因为数组元素中含有负数使得平方后的数组不在单调,但是最大值必然位于数组的端点,我们只需逐个比较端点值的大小并将其放入到新的数组中即可完成排序。
2. Q2:结束排序的条件?
A2:需要能不重复的遍历完数组所有元素,头指针i与尾指针j,当判断条件为(i<j)时,仅仅只是得到了i与j中的“胜者”,而败者也需要放入新的数组中,故正确的判断条件应为(i<=j)。

代码

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

    }
};

来源:代码随想录

二、长度最小的子数组

题目

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足
其和 ≥ target 的长度最小的连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

来源:力扣209

思路

滑动窗口法(实际上也是双指针):终止指针的前进使得窗口不断变大,起始指针的前进使得窗口不断的减小;通过起始指针与终止指针的差可以获得窗口的大小。

阻碍

1. Q1:窗口是什么?
A1:由起始指针与终止指针夹住的一段连续的数组段。
2. Q2:怎么滑动?
A2:只有一个指针动不叫滑动 叫拉长,所以滑动是需要起始与终止指针都变动的。终止指针用来满足target,而起始指针用来退出target。

代码

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

    }
};

三、螺旋矩阵II

题目

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例:
算法-有序数组的平方,长度最小的子数组,螺旋矩阵II

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

来源:力扣59

思路

先将正方形的一圈分成四份,且四份边长是等长的(不等长不好退出循环),然后按照顺时针方向(逆时针也可),一条边一条边的赋值。

阻碍

1. Q1:怎么选取边的长度?
A1:一般为n-1,如果为n则会导致其他边长短不一,是的保持四条边相等是十分重要的,但是因为每赋值完成一圈,下一圈的边长都会变短,所以实际上边长是一个变量n-offset(offset与循环的圈数相关)。
2. Q2:循环的起始点怎么确定?
A2:一开始设为(0,0),之后每循环一圈横纵坐标各+1,(0,0)->(1,1)->(2,2)。
3. Q3:循环的圈数以及中心元素的赋值?
A4:圈数loop=n/2,当n为偶数时,n/2为整数,所有位置均可遍历,也不存在中心元素;当n为奇数时,n/2为小数,int型数据向下取整,遍历会漏下唯一一个中心元素,坐标为(n/2,n/2),需单独判断单独赋值。

代码

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

          }
          for(;i<n-offset;i++){
              res[i][j]=count++;

          }
          for(;j>starty;j--){
              res[i][j]=count++;

          }
          for(;i>startx;i--){
             res[i][j]=count++; 
          }
          startx++;
          starty++;
          offset++;
      }
      if(n%2){
          res[mid][mid]=count;
      }
      return res;
    }
};

来源:代码随想录文章来源地址https://www.toymoban.com/news/detail-500171.html

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

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

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

相关文章

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

    LeetCode977.有序数组的平方 思路:         双指针应用         因为数组是有序的,数组中可能存在负数,所以其平方的最大值只可能是数组的头或尾,因此可以定义两个指针,i指向头,j指向尾。同时定义一个新数组result,让k指向新数组的最后一个元素,当nums[i] * nums[i]

    2023年04月21日
    浏览(30)
  • 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日
    浏览(35)
  • 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日
    浏览(31)
  • 代码随想录day2|有序数组的平方、长度最小的子数组、螺旋矩阵

    前言:今天去校医院拔了两颗牙,太痛了,今天写的博客就比较水。 所谓滑动窗口,就是不断的调节 子序列的起始位置和终止位置 ,从而得出我们要想的结果。

    2024年02月01日
    浏览(33)
  • 代码随想录第二天|977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

    第二天开始了, 一开始自己写,就只想到了先一个个平方,再排序(甚至打算手写排序循环,后来才发现c++有自带的排序函数sort(a.begin(),a.end()),c++真好,加油努力学习c++。 第二种方法然后看提示用双指针也完全没想出来,只能看文章了,泪 写完发现代码乱七八糟,要改。

    2024年02月13日
    浏览(27)
  • 【C++代码】有序数组的平方,长度最小的子数组,螺旋矩阵 II--代码随想录

    题目:有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums ,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 题解 数组其实是有序的, 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端, 不是最左边就是最右边,不

    2024年02月11日
    浏览(33)
  • Leetcode 977-有序数组的平方 | LeetCode209-长度最小的子数组 | Leetcode59-螺旋矩阵

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

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

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

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

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

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

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

    2024年02月02日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包