数组
二分查找
这道题是二分查找的模板题,主要考察的是对二分查找的理解,同时也考察了对边界条件的处理。
js
// 左闭右闭
var search = function (nums, target) {
let left = 0;
let right = nums.length - 1; // 一开始忘了减1,导致可能left === right,越界,nums[mid]取不到,导致返回错误值
while (right >= left) {
// 不能忽略left === right 的情况
let mid = Math.floor((left + right) / 2);
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
};移除元素
双指针法,一个指针遍历数组,一个指针记录新数组的位置。
js
var removeElement = function (nums, val) {
let prev = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== val) {
nums[prev] = nums[i];
prev++;
}
}
return prev;
};有序数组的平方
这道题已经排序好了,但是负数平方后可能比正数大,有可能导致负数平方后需要放到后面,这样我们就用双指针,看看前面的会不会比后面的大,如果比后面的大,就先放后面的,否则放前面的。
js
var sortedSquares = function (nums) {
let p1 = 0;
let p2 = nums.length - 1;
let res = [];
for (let i = nums.length - 1; i >= 0; i--) {
let num1 = nums[p1] * nums[p1];
let num2 = nums[p2] * nums[p2];
if (num2 > num1) {
res[i] = num2;
p2--;
} else {
res[i] = num1;
p1++;
}
}
return res;
};长度最小的子数组
这道题是滑动窗口的模板题,主要考察的是对滑动窗口的理解,同时也考察了对边界条件的处理。
js
var minSubArrayLen = function (target, nums) {
let left = 0;
let sum = 0;
let res = Infinity;
for (let right = 0; right < nums.length; right++) {
sum += nums[right];
// 开始滑动窗口
while (sum >= target) {
res = Math.min(res, right - left + 1);
sum -= nums[left];
left++;
}
}
return res === Infinity ? 0 : res;
};螺旋矩阵 II
js
var generateMatrix = function (n) {
let startX = 0;
let startY = 0;
let offset = 1;
let loop = Math.floor(n / 2);
let mid = Math.floor(n / 2);
let count = 1;
const res = new Array(n).fill(0).map(() => new Array(n).fill(0)); // 初始化要注意哦
while (loop--) {
let i = startX;
let j = startY;
// 左闭右开
for (; j < n - offset; j++) {
res[i][j] = count++;
}
for (; i < n - offset; i++) {
res[i][j] = count++;
}
for (; j > startY; j--) {
res[i][j] = count++;
}
for (; i > startX; i--) {
res[i][j] = count++;
}
startX++;
startY++;
offset++;
}
// 处理边界
if (n % 2 === 1) {
res[mid][mid] = count;
}
return res;
};