977.有序数组的平方
思路一:暴力解法
先遍历数组全部平方,再进行排序
时间复杂度O(nlgn)
代码:
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
for (let i=0; i < nums.length; i++) {
nums[i] *= nums[i];
}
return nums.sort((a, b) => a-b);
};
思路二:双指针
将两个指针i和j分别指向数组两端, 指针k指向新数组的末端
如果 nums[i] *nums[i] > nums[j] * nums[j] ,将 result[k--] = nums[i] *nums[i] , 后将 i++
如果 nums[i] *nums[i] <= nums[j] * nums[j] ,将 result[k--] = nums[j] *nums[j] , 后将 j--
循环至两个指针重合
代码:
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let result = [];
let i = 0, k = nums.length - 1, j = nums.length - 1;
while (i <= j) {
let left = nums[i] * nums[i],
right = nums[j] * nums[j];
if (left > right) {
result[k] = left;
k--;
i++;
} else {
result[k] = right;
k--;
j--;
}
}
return result;
};
209.长度最小的子数组
思路一:暴力解法
双循环
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let sum = 0, subLength = 0;
let result = Infinity;
for (let i=0; i < nums.length; i++) {
sum = 0;
for (let j=i; j < nums.length; j++) {
sum += nums[j];
if (sum >= target) {
subLength = j-i+1;
result = result < subLength ? result : subLength;
break;
}
}
}
return result === Infinity ? 0 : result;
};
思路二:滑动窗口
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let start = 0, end = 0, sum = 0, len = 0;
let result = Infinity;
while (end < nums.length) {
sum += nums[end];
while (sum >= target) {
len = end - start + 1;
result = result < len ? result : len;
sum -= nums[start];
start++;
}
end++;
}
return result === Infinity ? 0 : result;
};
59.螺旋矩阵II
思路:坚持循环不变量原则
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let startX = 0, startY = 0; // 起始位置
let mid = Math.floor(n/2); // 中间位置
let loop = 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, col = startY;
for (; col < n-offset; col++) {
res[row][col] = count++;
}
for (; row < 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++;
}
// 如果n为奇数的话,需要单独给矩阵最中间的值赋值
if (n % 2 === 1) {
res[mid][mid] = count;
}
return res;
};