有序数组的平方
题目链接:有序数组的平方
- 思路:由于题目是非递减序列,有可能包含负数,平方后会大于前面的值,所以新的数组的最大值一定在左右两边,想到可以用双指针,left & right左右遍历,找出最大值赋值给新数组的最右边
- 时间复杂度:O(n)
- 空间复杂度: O(1)
var sortedSquares = function(nums) {
const res = new Array(nums.length).fill(0)
let i = 0, j = nums.length - 1, k = nums.length - 1
while(i <= j) {
let left = nums[i] * nums[i]
let right = nums[j] * nums[j]
if(left <= right) {
res[k--] = right
j--
} else {
res[k--] = left
i++
}
}
return res
};
长度最小子数组
题目链接:长度最小的子数组
- 思路:由于要找出最小的满足target的子数组的长度,可以用双指针定义一个滑动窗口,使用快慢指针
- 时间复杂度:O(n)
- 空间复杂度:O(1)
var minSubArrayLen = function(target, nums) {
let fast = 0, slow = 0
let sum = 0, len = Infinity
for(; fast < nums.length; fast++) {
sum += nums[fast]
while(sum >= target) {
len = len < (fast - slow + 1) ? len : (fast - slow + 1)
sum -= nums[slow++]
}
}
return len === Infinity ? 0 : len
};
螺旋矩阵
题目链接
var generateMatrix = function(n) {
const arr = new Array(n).fill(0).map(() => new Array(n).fill(0))
let startX = startY = 0
let offset = 1
let mid = loop = Math.floor(n / 2)
let count = 1
while(loop--) {
let raw = startX, col = startY
for(; col < n - offset; col++) {
arr[raw][col] = count
count++
}
for(; raw < n - offset; raw++) {
arr[raw][col] = count
count++
}
for(; col > startY; col--) {
arr[raw][col] = count
count++
}
for(; raw > startX; raw--) {
arr[raw][col] = count
count++
}
offset++
startX++
startY++
}
if(n % 2) {
arr[mid][mid] = count
}
return arr
};