977.有序数组的平方
关键点
有序数组中,平方最大的值只可能出现在左右两端。
题解
var sortedSquares = function(nums) {
// 头尾指针:
// 由于数组本身是有序的,只是负数平方后变大,所以最大值只可能在数组两端
let left = 0, right = nums.length - 1, res = [];
while(left <= right) {
if(Math.abs(nums[left]) <= Math.abs(nums[right])) {
res.unshift(nums[right] * nums[right]);
right--;
} else {
res.unshift(nums[left] * nums[left]);
left++
}
}
return res;
};
209.长度最小的子数组
关键点
滑动窗口: 代码随想录 (programmercarl.com)
题解
var minSubArrayLen = function(target, nums) {
// // 法一:暴力法
// let res = Infinity;
// for(let i = 0; i < nums.length; i++) {
// let sum = 0;
// for(let j = i; j < nums.length; j++) {
// sum += nums[j];
// if(sum >= target) {
// res = Math.min(res, j - i + 1);
// }
// }
// }
// return res == Infinity ? 0 : res;
// 法二:滑动窗口
let res = Infinity;
let left = right = 0;
let sum = 0;
while(right < nums.length) {
if(sum + nums[right] >= target) {
res = Math.min(res, right - left + 1);
sum -= nums[left];
left++;
} else {
sum += nums[right];
right++;
}
}
return res == Infinity ? 0 : res;
};
59.螺旋矩阵II
关键点
题解
var generateMatrix = function(n) {
let startX = startY = 0; // 起始位置
let loop = Math.floor(n/2); // 旋转圈数
let mid = Math.floor(n/2); // 中间位置
let offset = 1; // 控制每一层填充元素个数
let count = 1; // 更新填充数字
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
while (loop--) {
let row = startX, col = startY;
// 上行从左到右(左闭右开)
for (; col < startY + n - offset; col++) {
res[row][col] = count++;
}
// 右列从上到下(左闭右开)
for (; row < startX + n - offset; row++) {
res[row][col] = count++;
}
// 下行从右到左(左闭右开)
for (; col > startY; col--) {
res[row][col] = count++;
}
// 左列做下到上(左闭右开)
for (; row > startX; row--) {
res[row][col] = count++;
}
// 更新起始位置
startX++;
startY++;
// 更新offset
offset += 2;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2 === 1) {
res[mid][mid] = count;
}
return res;
};