977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数
思路一、直接用封装后的方法
function sortArray(nums) {
nums = nums.map((item)=>item*item)
nums.sort((a,b)=>a-b)
return nums
};
思路二、 双指针
var sortedSquares = function(nums) {
let res = []
let left = 0
let right = nums.length-1
while(left<=right){
if(Math.abs(nums[left])>Math.abs(nums[right])){
res.unshift(nums[left])
left++
}else{
res.unshift(nums[right])
right--
}
}
res = res.map(item=>item*item)
return res
}
// 循环结构优化,unshift 操作比较耗时
let i = right
while(left<=right){
if(Math.abs(nums[left])>Math.abs(nums[right])){
res[i] = nums[left]
left++
}else{
res[i] = nums[right]
right--
}
i--
}
209. 长度最小的子数组
思路一、滑动窗口
function(target, nums) {
let MinSize = Infinity
let left = 0
let right = 0
let count = 0
while(right<nums.length){
count += nums[right]
while(count>=target){
MinSize = Math.min(MinSize,right-left+1)
count -= nums[left++]
}
right++
}
return MinSize === Infinity ? 0 : MinSize
};
59. 螺旋矩阵
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
思路一、模拟
function(n) {
let l = 0, r = n - 1, t = 0, b = n - 1;
let mat = new Array(n).fill(0).map(() => new Array(n).fill(0));
let num = 1, tar = n * n;
while(num <= tar){
for(let i = l; i <= r; i++){mat[t][i] = num++} // left to right.
t++;
for(let i = t; i <= b; i++)mat[i][r] = num++; // top to bottom.
r--;
for(let i = r; i >= l; i--) mat[b][i] = num++; // right to left.
b--;
for(let i = b; i >= t; i--) mat[i][l] = num++; // bottom to top.
l++;
}
return mat
};
总结
数组常见方法:
1. 滑动窗口 :一段序列满足一定条件,求该序列的最?值
2. 双指针 : 节约for循环次数
3. 模拟法 : 模拟螺旋的顺序