977-有序数组的平分
题目
双指针法
一个指针从头部开始,一个指针从尾部开始,
比较两个指针指向位置的平方值,选择更大的插入新数组,并更新指针
var sortedSquares = function(nums) { // 数组元素会有负值,平方后可能变成最大值 // 最大值只能出现在两端,分别计算平分,更大的放进数组;重复进行该操作,向数组插入元素 let ans = []; for(let p=0,q=nums.length-1;p<=q;){ // p是开头 q是结尾 if(nums[p]**2<nums[q]**2){ ans.unshift(nums[q]**2); q--; }else{ ans.unshift(nums[p]**2); p++; } } return ans; };
209长度最小的数组
滑动窗口
left和right指针分别代表窗口的开始和结束位置
每轮迭代加上nums[right]以更新窗口内数组元素和,当和大于target时,在满足和大于target时右移left
var minSubArrayLen = function(target, nums) { // 滑动窗口 let left=0,right=0,sum=0; let result=Infinity; while(right<nums.length){ sum+=nums[right]; while(sum>=target){ result=Math.min(result,right-left+1); sum-=nums[left++]; } right++; } return result==Infinity?0:result };
59螺旋矩阵Ⅱ
模拟矩阵生成过程,从左到右,从上到下,从右到左,从下到上形成闭环
始终按照左闭右开的规则进行,避免漏掉或重复某元素
left和right表示对某一行进行赋值时,最左侧和最右侧的下标
top和bottom表示对某一列进行赋值时,最上端和最下端的下标
-
首先从左到右赋值,完成赋值后,需要赋值的行数-1,即top-1;
-
接着从上到下赋值,完成赋值后,需要赋值的列数-1,即right-1;
-
从右到左赋值,完成赋值后,需要赋值的行数-1,即bottom-1
-
从上到下赋值,完成赋值后,需要赋值的列数-1,即left-1
var generateMatrix = function(n) { //左闭右开 let res = new Array(n).fill(0).map(() => new Array(n).fill(0)); let left=0,right=n-1; let top=0,bottom=n-1; let counter=1; while(left<=right && top<=bottom){ // 从左到右 for(let i=left;i<=right;i++){ res[top][i] = counter++; } top++; // 从上到下 for(let i=top;i<=bottom;i++){ res[i][right] = counter++; } right--; // 从右到左 for(let i=right;i>=left;i--){ res[bottom][i] = counter++; } bottom--; // 从下到上 for(let i=bottom;i>=top;i--){ res[i][left]=counter++; } left++; } return res; };