今日学习:
977.有序数组的平方
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep
第一想法
显然是先想着先将各元素平方push至新数组,然后进行快速排序;后来结合双指针思路,我意识到可以从两边寻找最大的数,对新数组进行填充
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function (nums) {
let left = 0
let right = nums.length - 1
let newnums = [] //改为 let newnums = new Array(n).fill(0); 更规范
let k = right
while (left <= right) {
if (nums[left] * nums[left] < nums[right] * nums[right]) {
newnums[k] = nums[right] * nums[right]
right--
} else {
newnums[k] = nums[left] * nums[left]
left++
}
k--
}
return newnums
};
209.长度最小的子数组
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
第一想法
改题目最关键的一点就是要先调整滑动窗口的重点,再一点点减起点
第一次做的时候未考虑到将返回的长度定义为无穷大,导致消耗了点时间
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function (target, nums) {
let sum = 0
let i = 0
let length = Infinity
for (let j = 0; j <= nums.length - 1; j++) {
sum += nums[j]
while (sum >= target) {
length = Math.min(length, j - i + 1)
sum -= nums[i++]
}
}
return length === Infinity ? 0 : length
};
209.长度最小的子数组.gif
59.螺旋矩阵
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
第一想法
这道题其实每次做一开始都会想很多,但其实只要边画图边敲代码,就可以很快做出来,还是要多回顾这个螺旋矩阵
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function (n) {
let sx = 0
let sy = 0
let os = 1
let count = 1
let nums = new Array(n).fill(0).map(() => new Array(n).fill(0));
let loop = Math.floor(n / 2)
while (loop--) {
let j = sy, i = sx
for (; j < n - os; j++) {
nums[sx][j] = count++
}
for (; i < n - os; i++) {
nums[i][j] = count++
}
for (; j > sy; j--) {
nums[i][j] = count++
}
for (; i > sx; i--) {
nums[i][j] = count++
}
sx++
sy++
os++
}
let mid = Math.floor(n / 2)
if (n % 2 == 1) {
nums[mid][mid] = n * n
}
return nums
};
image.png
数组总结
image.png
温故而知新,我能熟练掌握二分法,双指针法,滑动窗口,循环矩阵等知识,多回顾才能扎实!