题目1、977. 有序数组的平方
思路
双指针法,1种是从两头开始,相当于从大到小插入元素到数组前面,每次比较大小,插入大的,并且移动指针,直到2者相遇。
var sortedSquares = function(nums) {
let len = nums.length;
let i = 0;
let j = len - 1;
let res = []
let count = 0;
while (i <= j) {
count++;
let squareI = nums[i] * nums[i];
let squareJ = nums[j] * nums[j];
if (squareI < squareJ) {
res[len - count] = squareJ;
j--;
} else {
res[len - count] = squareI;
// res.unshift(squareI)
i++
}
}
return res;
};
双指针法,方法2,找到第一个大于0的元素j,i是前一个元素,向两边逐渐扩散,直到全部出界。
var sortedSquares = function(nums) {
let len = nums.length;
let j = 0;
let res = []
while(nums[j] < 0) {
j++;
}
let i = j - 1;
while(i >= 0 && j < len) {
let squareI = nums[i] * nums[i];
let squareJ = nums[j] * nums[j];
if (squareI < squareJ) {
res.push(squareI);
i--;
} else {
res.push(squareJ);
j++;
}
}
while (i >= 0) {
res.push(nums[i] * nums[i])
i--;
}
while (j < len) {
res.push(nums[j] * nums[j])
j++
}
return res;
};
题目二 209. 长度最小的子数组
思路
滑动窗口的思路,循环结束位置,不断累加,直到结果超过target,这时候开始增大起始值,直到不满足条件,同时更新满足条件的子序列的长度,取最小长度。
var minSubArrayLen = function(target, nums) {
let sum = 0;
let result = Number.MAX_SAFE_INTEGER;
let i = 0;
let total = 0;
for (let j = 0; j < nums.length; j++) {
sum += nums[j];
total += nums[j];
while (sum >= target) {
const length = j - i + 1;
result = Math.min(result, length);
sum -= nums[i++];
}
}
if (total < target) {
return 0;
}
return result;
};
题目三 59. 螺旋矩阵 II
思路
好多个变量, startX,startY代表每一圈的起始点,offset代表每一圈的偏移量,loop代表循环几圈,如果是奇数,则最中间的数字需要最后进行填充。
循环:每次保证左闭右开
- 先填充上面一行
- 填充右侧列
- 填充下面一行
- 填充左侧列
var generateMatrix = function(n) {
let startX = 0;
let startY = 0;
let offset = 1;
let result = new Array(n).fill(0).map(item => new Array(n).fill(0));
let count = 1;
let loop = Math.floor(n / 2);
while (loop-- > 0) {
let row = startX;
let col = startY;
for (; col < n - offset; col++) {
result[row][col] = count++;
}
for (; row < n - offset; row++) {
result[row][col] = count++;
}
for (; col > startY; col--) {
result[row][col] = count++;
}
for (; row > startX; row--) {
result[row][col] = count++;
}
startX++;
startY++;
offset++;
}
if (n % 2 === 1) {
let center = Math.floor(n / 2);
result[center][center] = count;
}
return result;
};