977.有序数组的平方
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
题目:
给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
暴力的解法:
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function (nums) {
for(let i=0;i<nums.length;i++){
nums[i] = nums[i] * nums[i]
}
nums.sort((x,y)=> x-y)
return nums
};
双指针:
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function (nums) {
let left = 0
let len = nums.length
let right = len -1
let newArr = new Array(len).fill(0) //新的数组放结果的数组
let newArrRight = len -1
while(left <= right){
let leftRes = nums[left] * nums[left]
let rightRes = nums[right] * nums[right]
if(leftRes < rightRes){
newArr[newArrRight] = rightRes
newArrRight --
right --
}
else{
newArr[newArrRight] = leftRes
newArrRight --
left ++
}
}
return newArr
};
209.长度最小的子数组
题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于
target
的长度最小的 连续子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组[4,3]是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
使用滑动窗口:
解题的方法:
在本题中实现滑动窗口,主要确定如下三点:
- 窗口内是什么?
- 如何移动窗口的起始位置?
- 如何移动窗口的结束位置?
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引 。
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let left = 0
let ans = Infinity
let sum = 0
let len = nums.length
for(let right = 0;right < len; right++){
sum += nums[right]
while(sum >= target){ // 使用while可以在满足条件时一直循环
ans = Math.min(ans, right -left +1)
sum = sum - nums[left] //和减去左端的数据
left ++ // 左侧端点右移
}
}
return ans === Infinity?0:ans
};
59.螺旋矩阵II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
思路:
而求解本题依然是要坚持循环不变量原则。
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let res = new Array(n).fill(0).map(()=> new Array(n).fill(0))
let left = 0
let right = n -1
let top = 0
let bottom = n -1
let num = 1
while( num <= n * n ){ //循环的条件
// 从第一行开始,根据left和right计算
//先计算上
for(let i = left;i<= right;i++){
res[top][i] = num
num ++
}
top ++
// 计算右边
for(let i = top;i<= bottom;i++){
res[i][right] = num
num ++
}
right --
//计算下
for(let i = right; i>= left; i--){
res[bottom][i] = num
num ++
}
bottom--
//计算左边
for(let i = bottom;i>= top; i--){
res[i][left] = num
num ++
}
left ++
}
return res
};