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

题目:

给你一个按 非递减顺序 排序的整数数组 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]

暴力的解法:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function (nums) {
    for(let i=0;i<nums.length;i++){
        nums[i] = nums[i] * nums[i]
    }
    nums.sort((x,y)=> x-y)
    return nums
};

双指针:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function (nums) {
    let left = 0 
    let len = nums.length
    let right = len -1
    let newArr = new Array(len).fill(0) //新的数组放结果的数组
    let newArrRight = len -1
    while(left <= right){
        let leftRes = nums[left] * nums[left]
        let rightRes = nums[right] * nums[right]
        if(leftRes < rightRes){
            newArr[newArrRight] = rightRes
            newArrRight --
            right -- 
        }
        else{
            newArr[newArrRight] = leftRes
            newArrRight --
            left ++ 
        }

    }
    return newArr
};

 209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。  拓展题目可以先不做。 

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录

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

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续

子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

示例 1:

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

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

使用滑动窗口:

解题的方法:

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引 。

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let left = 0
    let ans = Infinity
    let sum = 0
    let len = nums.length
    for(let right = 0;right < len; right++){
        sum += nums[right]
        while(sum >= target){ // 使用while可以在满足条件时一直循环
            ans = Math.min(ans, right -left +1)
            sum = sum - nums[left] //和减去左端的数据
            left ++ // 左侧端点右移
        }
    }
    return ans === Infinity?0:ans
};

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

示例 1:

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

示例 2:

输入:n = 1
输出:[[1]]

 思路:

而求解本题依然是要坚持循环不变量原则。

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let res = new Array(n).fill(0).map(()=> new Array(n).fill(0))
    let left = 0 
    let right = n -1
    let top = 0
    let bottom = n -1 
    let num = 1
    while( num <= n * n ){ //循环的条件
    // 从第一行开始,根据left和right计算
    //先计算上
      for(let i = left;i<= right;i++){
        res[top][i] = num
        num ++
      }
      top ++
    // 计算右边
      for(let i = top;i<= bottom;i++){
        res[i][right] = num
        num ++
      }
      right -- 
      //计算下
      for(let i = right; i>= left; i--){
        res[bottom][i] = num
        num ++
      }
      bottom--
      //计算左边
      for(let i = bottom;i>= top; i--){
        res[i][left] = num
        num ++
      }
      left ++
    }

   return res
};

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值