题目一 59. 螺旋矩阵 II
思路
题目是要模拟二维数组的赋值,循环一圈一圈的去赋值,需要注意的点:
- 计算转几圈: n / 2取整即为圈数,这里需要注意的是,如果是奇数,最后复制完后,需要将最中心的点进行赋值,偶数的话就不需要了。
- 每个方向的模拟需要有一个准则,都一条边都负责左闭右开的区间, 否则操作可能会乱掉。
解题
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
const arr = new Array(n).fill(0).map(item => new Array(n).fill(0));
let startX = 0;
let startY = 0;
let offset = 1;
let count = 1;
let circle = parseInt(n / 2, 10);
while (circle--) {
let i = startY;
let j = startX;
for (;j < n - offset; j++) {
arr[i][j] = count++;
}
for (;i < n - offset; i++) {
arr[i][j] = count++;
}
for (; j > startY; j--) {
arr[i][j] = count++;
}
for (; i > startY; i--) {
arr[i][j] = count++;
}
startX++;
startY++;
offset++;
}
if (n % 2 === 1) {
const center = parseInt(n / 2, 10);
arr[center][center] = count;
}
return arr;
};
题目二 209. 长度最小的子数组
思路
滑动数组的思想,对结果指针遍历,如果小于target,持续遍历,如果遇到了大于target的元素,则循环的将初始位置的index往后+1,并且不断计算最小长度。要注意的点:
- sum可以等于target
- 长度是j - i + 1
var minSubArrayLen = function(target, nums) {
let sum = 0;
let minLen = Infinity;
let i = 0;
for (let j = 0; j < nums.length; j++) {
sum += nums[j];
while (sum >= target) {
minLen = Math.min(j - i + 1, minLen);
sum -= nums[i];
i++;
}
}
return minLen === Infinity ? 0 : minLen;
};
题目三 977. 有序数组的平方
思路
两端的数值的平方一定是最大的,使用2个指针,分别从前和后遍历,比较当前的值,将大的插入,对应的索引++或者--。
var sortedSquares = function(nums) {
const len = nums.length;
const result = new Array(len);
let index = len - 1;
let i = 0;
let j = len - 1;
while (i <= j) {
const squareI = nums[i] * nums[i];
const squareJ = nums[j] * nums[j];
if (squareI > squareJ) {
result[index--] = squareI;
i++;
} else {
result[index--] = squareJ;
j--;
}
}
return result;
};
总结
数组的题目只有5道,做一个总结,数组中利用双指针的场景还是挺多的。