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
注意:
1、本身为非递减排序的数组,返回平方后的数组,并且也按照递增顺序。由于原数组本身有序,因此平方后的数组最大的数值一定在两端(这种涉及到两端的可以考虑采用左右指针)。
2、要想到新建立一个数组,并且指针指向数组最后一位。
方法一:之前做过,这次按照思路自己先写的(区别就是while循环不一样)
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let i = 0,j = nums.length-1;
let res = new Array(nums.length).fill(0);
let k = res.length-1;
while(i !== j){
if(nums[i]*nums[i] <= nums[j]*nums[j]){
res[k] = nums[j]*nums[j];
k--;
j--;
}else{
res[k] = nums[i]*nums[i];
k--;
i++;
}
}
res[k] = nums[i]*nums[i];
return res;
};
当时在想剩下的最后一位该怎么放到新数组里,画图想到了这种情况下是i===j,所以将其设为while循环的条件,但是需要在while循环外补充一下赋值语句。
方法二:标准解法
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let left = 0,right = nums.length-1;
let k = nums.length-1;
let res = new Array(nums.length).fill(0);
//这里循环条件设为left<=right,因此包含了相等时的情况
while(left <= right){
if(nums[left]*nums[left] <= nums[right]*nums[right]){
res[k] = nums[right]*nums[right];
k--;
right--;
}else{
res[k] = nums[left]*nums[left];
k--
left++;
}
}
return res;
};
209 长度最小的子数组
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
方法一:使用额外数组来存储长度
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let start = 0,end = 0;
let res = [];
let sum = 0;
while(end < nums.length){
sum += nums[end];
while(sum >= target){
res.push(end-start+1);
sum -= nums[start];
start++;
}
end++;
}
if(res.length === 0){
return 0;
}else{
//这里必须加上升序参数,因为不加sort是对ASCII大小进行排序
res.sort((a,b) => a-b);
return res[0];
}
};
方法二:
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let start = 0,end = 0;
let result = Infinity;
let sum = 0;
while(end < nums.length){
sum += nums[end];
while(sum >= target){
result = Math.min(result,end-start+1);
//先更新sum,再start--,否则不是减掉正确的start
//缩小窗口
sum -= nums[start];
start++;
}
//放大窗口
end++;
}
return result === Infinity ? 0 : result;
};
sort函数的使用可参考:https://www.cnblogs.com/aixue/p/7064251.html?utm_source=debugrun&utm_medium=referral
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) {
//创建二维数组
const matrix = new Array(n);
for (let i = 0; i < n; i++) {
matrix[i] = new Array(n);
}
let top=0,bottom=n-1,left=0,right=n-1;
let num = 1;
while(num <= n*n){
for(let i = left;i<=right;i++){
matrix[top][i] = num;
num++;
};
top++;
for(let i = top;i<=bottom;i++){
matrix[i][right] = num;
num++;
}
right--;
for (let i = right; i >= left; i--) {
matrix[bottom][i] = num
num++;
}
bottom--;
for (let i = bottom; i >= top; i--) {
matrix[i][left] = num
num++;
}
left++;
}
return matrix;
};
这次做螺旋矩阵,发现:
1.for循环里i的起始和范围判断是看从左到右,从上到下,从右到左,从下到上,这样来的
2.nums[i][j]里的i,j可以按照画图那样对照看,会改变的是i,不变的看它是在上下左右哪一位置(图中粉色字)
3.本题采用左闭右闭区间,而不是左闭右开