代码随想录算法训练营第第二天 | 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;
};