俩道中等题全军覆没。。
977.有序数组的平方
思路:平方后的数组俩端大,中间小。俩个指针分别指向头尾开始比较,大的进新数组。同时大的一端的指针往中间移动一位,再和另外一端指针的值比较。以此反复。
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let newNums = []
let slow = 0
let fast = nums.length - 1
let k = nums.length - 1
while(slow <= fast){
if(nums[slow] ** 2 <= nums[fast] ** 2){
newNums[k] = nums[fast]
k--
fast--
}else{
newNums[k] = nums[slow]
k--
slow++
}
}
return newNums
};
209.长度最小的子数组
完全没思路,看题解的。
思路:通过循环计算出每项相加的值,当值大于或者等于目标值时,将初始位置向右移动一格。就这样不断调节出大于或等于目标值的区间,再经过缩区间看看是否能更小。
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let area = Infinity;
let sums = 0;
let i =0;
for(let j = 0;j<nums.length;j++){
sums +=nums[j]
while(sums >= target){
sums -= nums[i]
area = Math.min(area,j-i +1)
i++
}
}
return area == Infinity ? 0 : area
};
59.螺旋矩阵II
这题就更没有思路了。。。看了题解会觉得很妙,嗯,我不想写这么妙的..
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let doubleArray = new Array(n).fill(0).map(() => new Array(n).fill(0));
//循环圈数
let loop = n >> 1
//中间位置的坐标
let center = n >> 1
//开始位置/结束位置
let startX = 0;
let startY = 0;
//值
let count = 1;
//偏移量
let offset = 1;
while(loop){
i = startX
j = startY
//第一、二、三、四圈循环
for(;j< n - offset;j++){
doubleArray[i][j] = count
count ++
}
for(;i < n - offset;i++){
doubleArray[i][j] = count
count ++
}
for(;j>startY;j--){
doubleArray[i][j] = count
count ++
}
for(;i>startX;i--){
doubleArray[i][j] = count
count ++
}
loop --
offset ++
startX ++
startY ++
}
if(n % 2 === 1){
doubleArray[center][center] = count
}
return doubleArray
};
关键在于边界的处理,遵循左闭右开的原则,这样一圈才可以用统一的原则写出来。