今日题目:
- 977. 有序数组的平方
- 209.长度最小的子数组
- 59. 螺旋矩阵Ⅱ
解题思想:
- 双指针
977.有序数组的平方,此题破题的关键是:因为数组可能有负数,数组平方后,最大的数一定出现在数组两端。所以可以利用双指针从两边向里面探索。
- 滑动窗口
- 长度最小的子数组用的就是滑动窗口的思想。滑动窗口的思想其实与双指针类似,但是是取两个指针中间的集合的值,所以用滑动窗口来类比更加贴切。滑动窗口的重点就是:如何控制慢指针移动。快指针不断往后遍历,计算当前区间的元素总值,当超过target的时候,此时的区间就是满足条件的答案,所以记录它,此时才应移动慢指针,判断下一个区间是否也满足条件,并且寻找下一个满足条件的区间。通过动态调整慢指针起始位置,来收集不同长度区间里的和,比较
- 循环不变量
坚持一个思想去处理每一条边。我们不去处理每一条边最后一个节点,把这个节点留给下次循环,作为下次循环的第一个节点进行处理,统一为左闭右开
代码:
-
- 有序数组的平方
//时间复杂度为O(n)
var sortedSquares = function(nums) {
let L = 0
let R = nums.length-1
const res = [nums.length]
for(let i = nums.length-1; i >=0 ; i--) {
let num1 = nums[L] * nums[L]
let num2 = nums[R] * nums[R]
if(num1>num2) {
res[i] = num1
L++
} else {
res[i] = num2
R--
}
}
return res
};
- 209.长度最小的子数组
//时间复杂度O(n)
var minSubArrayLen = function(target, nums) {
let L = R = 0
let minSize = nums.length+1
let curSum = 0 //收集窗口里面的元素的和
while(R<nums.length) {
curSum += nums[R]
//注意,这里用的是while,慢指针向后移是一个持续向后移的过程,直到滑动窗口里面的元素和小于target为止
while(curSum >= target) {
minSize = Math.min(minSize, R-L+1)
curSum -= nums[L++]
}
R++
}
return minSize<=nums.length?minSize:0
}
-
- 螺旋矩阵Ⅱ
var generateMatrix = function(n) {
const res = Array.from(Array(n), () => Array(n).fill(0))
let startX = startY = 0
let loop = Math.floor(n/2) //圈数
let mid = Math.floor(n/2) //中间
let offset = 1
let count = 1
while(loop--) {
let row = startX, col = startY
for(;col < startY+n-offset; col++) {
res[row][col] = count++
}
for(;row < startX+n-offset; row++) {
res[row][col] = count++
}
for(;col>startY; col--) {
res[row][col] = count++
}
for(;row>startX; row--) {
res[row][col] = count++
}
startX++
startY++
offset += 2
}
if(n%2 ===1 ) {
res[mid][mid] = count
}
return res
};
总结:
因为一些突发状况先挖坑…过几天再填…
10.16已填坑,编译原理终于考完了,可以安心刷题了
数组篇完结,二分法掌握得还算不错,但是螺旋矩阵需要注意的点还蛮多的,并且不是很熟悉,需要多练几遍