977.有序数组的平方
1双指针法
- [√] 二刷
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
// 双指针
let i = 0, j = nums.length - 1, k = nums.length - 1;
let res = new Array(nums.length);
while (i <= j) {
if (nums[i] * nums[i] < nums[j] * nums[j]) {
res[k] = nums[j] * nums[j];
k--;
j--;
} else {
res[k] = nums[i] * nums[i];
k--;
i++;
}
}
return res;
};
2平方+排序
复杂度O(logn + n)
209.长度最小的子数组
滑动窗口法
要点是j是结尾指针,以及i的移动方式
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
// 滑动窗口法
let size = nums.length;
let sum = 0, sublength = 0, i = 0, res = Number.MAX_VALUE;
for (j = 0; j < size; j++) {
sum += nums[j];
while (sum >= target) {
sublength = j - i + 1;
res = res < sublength ? res : sublength;
sum -= nums[i];
i++;
}
}
return res === Number.MAX_VALUE ? 0 : res;
};
59.螺旋矩阵II
模拟 边界判断
之前出错在中心元素的坐标上
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let startX = 0, startY = 0;
let i = 0, j = 0;
let count = 1;
let loop = Math.floor(n / 2);
let offset = 1;
let res = new Array(n).fill().map(() => new Array(n).fill(0));
while (loop--) {
i = startX, j = startY;
// 上
for (; j < n - offset; j++) {
res[i][j] = count++;
}
// 右
for (; i < n - offset; i++) {
res[i][j] = count++;
}
// 下
for (; j > startY; j--) {
res[i][j] = count++;
}
// 左
for (; i > startX; i--) {
res[i][j] = count++;
}
startX++;
startY++;
offset++;
}
if (n%2 === 1) {
res[startX][startY] = count;
}
return res
};