代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方

力扣题目链接(opens new window)

给你一个按 非递减顺序 排序的整数数组 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] 输出:[4,9,9,49,121]

自我总结:

        该题有两种解法,暴力解法和双指针法。

        拿到题自己第一时间想的是先将数组平方,然后再排个序,也就是暴力解法。

        其次学习到双指针的又一种用法。要点①:首先非递减顺序意味着数组平方后最大的数一定存在于两头。要点②:两个指针指向数组的两头逐渐朝中间逼近,以遍历完所有的元素,另外新建一个数组以及一个指向新数组末尾的指针,旧数组中比较出一个更大值便往新数组中插入一个,直到遍历完。

解法代码:代码随想录 (programmercarl.com)

209.长度最小的子数组

力扣题目链接(opens new window)

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

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

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

自我总结:

        该题有两种解法:暴力解法和滑动窗口法。

        拿到题自己的思路是,用一层for循环控制连续子数组的头部,内嵌又一层for循环控制尾部,将数组中每个元素都作为头部尝试一下,得到结果。时间复杂度O(n^2

        学习新知识:滑动窗口法,只用一层for循环实现头部+尾部的遍历,用i表示头部,j表示尾部。要点①:唯一的一层for循环控制尾部,while循环:当一头一尾之间形成的窗口内的累加值满足条件时,记录下当前窗口的长度,并更新结果result。要点②:此时累加值减去头部元素的值,且将头部往后移一个单位(即i++),此时如果还满足while循环条件,便再走一遍①。时间复杂度O(n)

解法代码:代码随想录 (programmercarl.com)

59.螺旋矩阵II

力扣题目链接(opens new window)

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

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

自我总结:

        拿到该题,觉得会写很多for,写不出来,思路不够清晰。

        学习新知识:螺旋矩阵的解法可以理解为画圈,需要知道①画多少个圈②每一圈分为四个部分③每一圈的起始点(二维数组所以有两个参数)④一个圈的四个部分长度都相同就得规范区间,保持左闭右开,长度从第一个圈往里越来越短。⑤n为奇数时中心为一个点。

        每一圈都可以分成四个部分,其中每个部分为一个for循环,从左往右,从上往下,从右往左,从下往上。一个圈为一次循环,用while语句做死循环,当圈数减为零时不再执行循环,每次循环起始点要变化,圈的长度要变化。最后加上if语句,实现n为奇数时中心点的值。

解法代码:代码随想录 (programmercarl.com)

        

你可能感兴趣的:(算法,矩阵,数据结构)