977.有序数组的平方
var nums = [-4, -1, 0, 3, 10]
//方法一
var sortedSquares = function (nums) {
var arr = []
for (var i = 0; i < nums.length; i++) {
arr.push(nums[i] * nums[i]);
}
arr.sort((a, b) => a - b);
return arr;
};
//方法二
var sortedSquares = function (nums) {
let res = [];
let i = 0, j = nums.length - 1;
while (i <= j) {
if (nums[i] ** 2 > nums[j] ** 2) {
res.unshift(nums[i] ** 2);
i++;
} else {
res.unshift(nums[j] ** 2);
j--;
}
}
return res;
};
//方法三:暴力求解
var sortedSquares = function (nums) {
for (var i = 0; i < nums.length; i++) {
nums[i] = nums[i] * nums[i];
}
nums.sort((a, b) => a - b);
return nums;
}
//方法四:双指针
var sortedSquares = function (nums) {
let n = nums.length;
let res = new Array(n).fill(0);
let i = 0, j = n - 1, k = n - 1;
while (i <= j) {
let left = nums[i] * nums[i];
let right = nums[j] * nums[j];
if (left < right) {
res[k--] = right;
j--;
} else {
res[k--] = left;
i++;
}
}
return res;
};
209.长度最小的子数组
var target=7;
var nums=[2,3,1,2,4,3];
var minSubArrayLen = function(target, nums) {
let start, end
start = end = 0
let sum = 0
let len = nums.length
let ans = Infinity
while(end < len){
sum += nums[end];
while (sum >= target) {
ans = Math.min(ans, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans === Infinity ? 0 : ans
};
console.log(minSubArrayLen(target,nums));
59.螺旋矩阵II
var n = 3;
var generateMatrix = function (n) {
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
let left = 0, right = n - 1, top = 0, bottom = n - 1;
let num = 1;
while (left <= right && top <= bottom) {
for (let i = left; i <= right; i++) {
res[top][i] = num++;
}
top++;
for (let i = top; i <= bottom; i++) {
res[i][right] = num++;
}
right--;
for (let i = right; i >= left; i--) {
res[bottom][i] = num++;
}
bottom--;
for (let i = bottom; i >= top; i--) {
res[i][left] = num++;
}
left++;
}
return res;
};
//代码随想录的
var generateMatrix = function (n) {
let startX = 0;//起始行
let startY = 0;//起始列
let loop = Math.floor(n / 2);//循环次数
let mid = Math.floor(n / 2);//中间位置
let offset = 1;//偏移量,控制每一层填充元素个数
let count = 1;//计数,更新填充数字
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));//初始化数组
while (loop--) {
let row = startX;//行
let col = startY;//列
//从左到右.上行从左到右(左闭右开)
for (; col < startY + n - offset; col++) {
res[row][col] = count++;
}
//从上到下.右列从上到下(左闭右开)
for (; row < startX + n - offset; row++) {
res[row][col] = count++;
}
//从右到左.下行从右到左(右闭左开)
for (; col > startY; col--) {
res[row][col] = count++;
}
//从下到上.左列从下到上(右闭左开)
for (; row > startX; row--) {
res[row][col] = count++;
}
// 更新起始位置
startX++;
startY++;
// 更新offset
offset += 2;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2 === 1) {
res[mid][mid] = count;
}
return res;
}