977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
思路
- 暴力解法:直接平方之后再排序
- 双指针:给的是递增的顺序,因此数组两边的绝对值肯定是更大的,中间的绝对值是更小的,平方之后的最大值一定出现在两端,所以用两个指针比较绝对值大小,然后把平方之后的数组装进数组里,注意因为是递增,所以要从后往前给新数组赋值。
var sortedSquares = function(nums) {
let left = 0
let right = nums.length - 1
let len = nums.length - 1
let res = new Array(len)
while(left <= right) {
//这里直接比较乘积也可以
let m = Math.abs(nums[left])
let n = Math.abs(nums[right])
if (m >= n) {
res[len] = m * m
left++
}
else {
res[len] = n * n
right--
}
len--
}
return res
};
、、、
209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的子数组。
思路
- 双指针:首先需要满足和大于target,先移动右指针到满足条件,再移动左指针缩小范围,并且取最小的长度。
var minSubArrayLen = function(target, nums) {
let sum = 0
let min = Infinity
let right = 0
for (let i in nums) {
sum += nums[i]
while (sum >= target) {
min = Math.min(min, i - right + 1)
sum -= nums[right]
right++
}
}
螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
思路
- 建立一个 n * n 的二维数组,按照螺旋顺序赋值
- 一个计数器 记录 i 的值
- 遍历的顺序 分别是
- 行是上到下 列是左到右
- 列是右到左 行是上到下
- 行是下到上 列是右到左
- 列是左到右 行是下到上
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let i = 1
let res = new Array(n)
for (let i = 0 ; i < n; i++ ) {
res[i] = new Array(n).fill(0)
}
let left = 0
let right = n - 1
let bottom = n - 1
let top = 0
while (i <= n*n) {
//从上到下每一排都是如此
if (top <= bottom) {
//模拟从左到右的移动
for (let j = left; j <= right; j++) {
res[top][j] = i
i++
}
top++
}
if (right >= left) {
for (let j = top; j <= bottom; j++) {
res[j][right] = i
i++
}
right--
}
if (bottom >= top ) {
for (let j = right; j >= left; j-- ) {
res[bottom][j] = i
i++
}
bottom--
}
if (left <= right) {
for (let j = bottom; j >= top; j--) {
res[j][left] = i
i++
}
left++
}
}
return res
};