977.有序数组的平方
题目链接:. - 力扣(LeetCode)
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
双指针法:i指向起始位置,j指向终止位置
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function (nums) {
let res = []
let k = nums.length - 1
for(let i=0,j=nums.length-1;i<=j;){
if(nums[i]*nums[i] > nums[j]*nums[j]){
//k指向res数组终止位置
res[k] = nums[i]*nums[i]
k--
i++
}else{
res[k] = nums[j]*nums[j]
k--
j--
}
}
return res
};
209.长度最小的子数组
题目链接:. - 力扣(LeetCode)
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
滑动窗口(双指针法的一种):不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
只用一个for循环,循环的索引表示滑动窗口的终止位置
窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let sum = 0
let i = 0
let subLength = 0
let result = Number.MAX_VALUE
for(let j = 0; j < nums.length; j++){
sum = sum + nums[j]
while(sum >= target){
subLength = j-i+1
result = result < subLength ? result : subLength
sum = sum - nums[i]
i++
}
}
return result === Number.MAX_VALUE ? 0 : result
};
59.螺旋矩阵II
题目链接:. - 力扣(LeetCode)
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
坚持循环不变量原则!坚持每条边左闭右开的原则
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let loop = Math.floor(n/2)
let startX = 0
let startY = 0
let offset = 1
let mid = Math.floor(n/2)
let i, j
let res = new Array(n).fill(0).map(() => new Array(n).fill(0))
let count = 1
while(loop--){
i = startX
j = startY
for(; j<n-offset; j++){
res[i][j] = count
count++
}
for(; i<n-offset; i++){
res[i][j] = count
count++
}
for(; j>startY; j--){
res[i][j] = count
count++
}
for(; i>startX; i--){
res[i][j] = count
count++
}
startX++
startY++
offset++
}
if(n % 2 === 1){
res[mid][mid] = count
}
return res
};