有序数组的平方,长度最小的子数组,螺旋矩阵2

有序数组的平方

先说思路,因为是有序数组,所以最大值一定在头或尾,只需要比较头尾平方后的值,大的值放在新数组的尾部,尾部向头部前进一位,继续比较即可
完整代码

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let last =nums.length-1
    let left = 0
    let right = last
    let resArr = new Array(nums.length).fill(0)
    while(left <= right ){
        if(nums[left]*nums[left]>=nums[right]*nums[right]){
            resArr[last--]=nums[left]*nums[left]
            left++
        }
        if(nums[left]*nums[left]<nums[right]*nums[right]){
             resArr[last--]=nums[right]*nums[right]
             right--
        }
    }
    return resArr
};

长度最小的子数组

主要思路:

  1. 使用快慢指针
  2. 快指针为尾,慢指针为头,快指针-慢指针+1为最后子数组的长度
  3. 若快指针走到最后,循环终止
  4. 若sum结果大于target则移动慢指针,缩短快慢指针间的距离,以此来使sum<target
    完整代码
/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let slow = 0
    let fast = 0
    let len = nums.length
    let res = Infinity
    let sum=0
    while(fast<len){
        sum+=nums[fast]
        while(sum>=target){
           res = Math.min(res,fast-slow+1)//注意与下一行代码的先后顺序,先记录下此时的最小长度再操作slow
           sum-=nums[slow++]
        }
        fast++
    }
    return res===Infinity?0:res
};

螺旋矩阵2

主要思路:

  1. 为奇数就是n/2+1,为偶数就是n/2
  2. 进行顺时针转圈
  3. 一圈四个方向,没个方向设置只有头没有尾
    完整代码
/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let res = new Array(n).fill(0).map(() => new Array(n).fill(0));

    let count=1
    let startX=0
    let startY=0
    let loop=Math.floor(n/2)
    let mid = Math.floor(n/2)
    let offset=1
    function update(row,col){
        res[row][col]=count++
    }
    while(loop--){
        let row = startX
        let col =startY
        for(;col<n-offset;col++){
            update(row,col)
        }
        for(;row<n-offset;row++){
            update(row,col)
        }
        for(;col>startY;col--){
            update(row,col)
        }
        for(;row>startX;row--){
            update(row,col)
        }
        startX++
        startY++
        offset+=1
    }
    if(n%2===1){
        update(mid,mid)
    }
    return res
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值