有序数组的平方
先说思路,因为是有序数组,所以最大值一定在头或尾,只需要比较头尾平方后的值,大的值放在新数组的尾部,尾部向头部前进一位,继续比较即可
完整代码
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let last =nums.length-1
let left = 0
let right = last
let resArr = new Array(nums.length).fill(0)
while(left <= right ){
if(nums[left]*nums[left]>=nums[right]*nums[right]){
resArr[last--]=nums[left]*nums[left]
left++
}
if(nums[left]*nums[left]<nums[right]*nums[right]){
resArr[last--]=nums[right]*nums[right]
right--
}
}
return resArr
};
长度最小的子数组
主要思路:
- 使用快慢指针
- 快指针为尾,慢指针为头,快指针-慢指针+1为最后子数组的长度
- 若快指针走到最后,循环终止
- 若sum结果大于target则移动慢指针,缩短快慢指针间的距离,以此来使sum<target
完整代码
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let slow = 0
let fast = 0
let len = nums.length
let res = Infinity
let sum=0
while(fast<len){
sum+=nums[fast]
while(sum>=target){
res = Math.min(res,fast-slow+1)//注意与下一行代码的先后顺序,先记录下此时的最小长度再操作slow
sum-=nums[slow++]
}
fast++
}
return res===Infinity?0:res
};
螺旋矩阵2
主要思路:
- 为奇数就是n/2+1,为偶数就是n/2
- 进行顺时针转圈
- 一圈四个方向,没个方向设置只有头没有尾
完整代码
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
let count=1
let startX=0
let startY=0
let loop=Math.floor(n/2)
let mid = Math.floor(n/2)
let offset=1
function update(row,col){
res[row][col]=count++
}
while(loop--){
let row = startX
let col =startY
for(;col<n-offset;col++){
update(row,col)
}
for(;row<n-offset;row++){
update(row,col)
}
for(;col>startY;col--){
update(row,col)
}
for(;row>startX;row--){
update(row,col)
}
startX++
startY++
offset+=1
}
if(n%2===1){
update(mid,mid)
}
return res
};