代码随想录算法训练营第第二天 | 977.有序数组的平方 、27. 移除元素

977.有序数组的平方

题目建议: 本题关键在于理解双指针思想

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.有序数组的平方.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

/**
 * @param {number[]} nums
 * @return {number[]}
 * 双指针,用另一个数组承载最终的结果
 */
var sortedSquares = function(nums) {
    let i = 0;
    let j = nums.length-1;
    let k = nums.length-1;
    const res = new Array(nums.length);
    while(i<=j){
        if(Math.pow(nums[i],2)<Math.pow(nums[j],2)){
            res[k] = Math.pow(nums[j],2);
            j--;
            
        } else {
            res[k] = Math.pow(nums[i],2);
            i++;
        }
        k--;
    }
    return res;
};

209.长度最小的子数组

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

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.长度最小的子数组.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 * 能想到滑动窗口,做的时候是先进行累加,在加的过程进行判断,之前有点和快慢指针混淆了
 */
var minSubArrayLen = function(target, nums) {
    let i = 0;
    let min = nums.length+1;
    let total = 0;
    for(let j=0;j<nums.length;j++){
        total+=nums[j];
        while(total>=target){
            min = min > (j-i+1)?(j-i+1):min;              
            total -= nums[i];
            i++;
            
        }
    } 
    if (min === nums.length+1) {
        return 0;
    }
    return min;
};

59.螺旋矩阵II

题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.螺旋矩阵II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

/**
 * @param {number} n
 * @return {number[][]}
 *这个能想到用变量改变方向,但是思路太混乱,还是找出其中的规则
 */
var generateMatrix = function(n) {
    const resArr = new Array(n).fill(0).map(()=>new Array(n).fill(0));
    let startx  = 0,starty=0; //每个圈的开始坐标
    let loop = Math.floor(n/2);  //一共循环几个圈
    let i,j;
    let offest = 1;//控制每条边的遍历长度
    let count = 1; //赋值的数字
    let mid = Math.floor(n/2); //如果n是奇数,则最中间的一圈只有一个数字,需单独赋值
    while(loop--){
        i = startx;
        j = starty
        for(j;j<n-offest;j++){
            resArr[i][j] = count++;
        }

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

        for(j;j>startx;j--){
            resArr[i][j] = count++;
        }

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

        startx++;
        starty++;
        offest+=1;
    }
    if (n%2) {
        resArr[mid][mid]=n*n;
    }
    return resArr;
};
posted @ 2024-05-09 22:46  YuanYF6  阅读(2)  评论(0编辑  收藏  举报