977有序数组的平方
本题要点
首先定义三个指针,左右指针分别从左边和右边开始寻找比较更大的数放在右边,放置操作由另一个指针k来实现。
代码实现
JS内置API
可以直接使用数组内置的map操作
var sortedSquares = function(nums) {
return nums.map( x => x * x).sort((a,b) => (a-b))
};
相向双指针法
var sortedSquares = function(nums) {
let ret = [], k = nums.length - 1, left = 0, right = nums.length - 1;
while(left <= right){
if(nums[left] * nums[left] < nums[right] * nums[right]){
ret[k--] = nums[right] * nums[right];
right--;
} else {
ret[k--] = nums[left] * nums[left];
left++;
}
}
return ret;
};
209长度最小的子数组
本题要点
for循环用来表示窗口的终止位置,sum -= nums[i++] 更新sum的值结合前面的while的条件判断,并向后移动i,实现了前指针的向后移动。
代码实现
暴力解法
var minSubArrayLen = function(target, nums) {
// 暴力解法
let ret = undefined, sum = 0, subArr = 0;
for(let i = 0; i < nums.length; i++){
sum = 0;
for(let j = i; j < nums.length; j++){
sum += nums[j];
if(sum >= target){
subArr = j - i + 1;
// console.log(subArr)
ret = ret < subArr ? ret : subArr;
break;
}
}
}
return ret === undefined ? 0 : ret;
};
双指针(滑动窗口法)
js
var minSubArrayLen = function(target, nums) {
let ret = undefined, subArr = 0, i = 0, sum = 0
for(let j = 0; j < nums.length; j++){
sum += nums[j]
while(sum >= target){
subArr = j - i + 1
ret = ret < subArr ? ret : subArr
sum -= nums[i++]
}
}
return ret === undefined ? 0 : ret
};
59螺旋矩阵Ⅱ
本题要点
列出二维数组下标来推算i和j到底应该怎么修改,发现定义了很多新的变量,写下来发现除了start可以合并为一个、mid可以直接写成算式之外其他变量都不能缺。附上推算的纸币草图,其实还推了一下n=4和n=16的情况的,不太完整就不放图啦( ̄▽ ̄)"
代码实现
var generateMatrix = function(n) {
let loop = Math.floor(n / 2), start = 0, i = 0, j = 0, count = 1, offset = 1, mid = Math.floor(n / 2);
const arr = new Array(n).fill(0).map(() => new Array(n).fill(0))
while(loop--){
i = start;
j = start;
for(j = start; j < n - offset; j++){
arr[start][j] = count++;
}
for(i = start; i < n - offset; i++){
arr[i][j] = count++;
}
for(; j > start; j--){
arr[i][j] = count++;
}
for(; i > start; i--){
arr[i][j] = count++;
}
start++;
offset++;
}
if(n % 2){
arr[mid][mid] = count
}
return arr;
};