977.有序数组的平方
暴力解法
思路
先将数组计算平方,再排序。时间复杂度是O(n+nlogn),也就是O(nlogn)。
双指针解法
思路
数组是有序的,平方之后最大值一定在数组的两端,可以社两个指针从两侧进行移动,将平方值更大的数倒着填进数组中。时间复杂度为O(n)。
代码
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let start=0, end=nums.length-1, res=[], i=nums.length-1;
while(i >= 0) {
// js中可以用Math.abs()求平方
if(nums[start]*nums[start] > nums[end]*nums[end]) {
res[i--] = nums[start]*nums[start];
start++;
} else {
res[i--] = nums[end]*nums[end];
end--;
}
}
return res;
};
209.长度最小的子数组
暴力解法
思路
设置一个数组,保存可能存在的长度。
循环遍历整个数组,每遍历到一个数就开始求和n,如果n≥item,就将n填入数组中,并跳到下一个数。
返回长度数组中最小的值。
滑动窗口解法
思路
滑动窗口,就是不断调节子序列的起始位置和终点位置。
终止位置就是遍历的指针,当sum>=s,比较长度是否为最短长度,如果不是,将窗口收缩(向后移动慢指针),直到遍历完整个数组。
代码
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let slow=0, fast=0, count=0, min=nums.length, flag=0;
while(fast <= nums.length) {
count += nums[fast++];
// 收缩滑动窗口
while(count >= target) {
flag=1;
count-=nums[slow++];
min = min < fast-slow+1 ? min : fast-slow+1;
}
}
return flag ? min : 0;
};
59.螺旋矩阵II
思路
找到矩阵的变化规律,重点是划分好区间,所有的区间都要一致。
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let num=1, center=Math.floor(n/2);
let res = new Array(n).fill(0).map(()=>new Array(n).fill(0));
for(let i=0;i<center;i++) {
for(let j=i; j<n-1-i; j++) {
res[i][j] = num++;
}
for(let j=i ;j<n-1-i; j++) {
res[j][n-1-i] = num++;
}
for(let j=n-1-i ;j > i; j--) {
res[n-1-i][j] = num++;
}
for(let j=n-1-i ;j > i; j--) {
res[j][i] = num++;
}
}
if(n%2 === 1) {
res[center][center]=n*n;
}
return res;
};