目录
1.二分查找
思路:使用双指针,left 和 right,判断中间的值nums[half]是否等于target
- 当nums[half]大于target时,证明target值存在于左边部分
- 当nums[half]小于target时,证明target值存在于右边部分
- 当nums[half]等于target时,返回half值
function search(nums: number[], target: number): number {
let left = 0;
let right = nums.length - 1;
for (let i = 0; i < nums.length; i++) {
const half = (left + right) >> 1;
if (nums[half] > target) {
right = half - 1
} else if (nums[half] < target) {
left = half + 1
} else {
return half
}
}
return -1
};
2.移除元素
思路:根据题目描述,只需要将需要移除的元素放置至数组末尾即可。使用快慢指针,在遍历过程中,只要快指针的值不等于要移除的元素,就不断将快指针的值赋给慢指针,如果快指针的值等于要移除的值,则慢指针不动,快指针加一,最后返回慢指针的值
function removeElement(nums: number[], val: number): number {
let slow = 0;
let fast = 0;
for (fast; fast < nums.length; fast++) {
if (nums[fast] !== val) {
[nums[fast], nums[slow]] = [nums[slow], nums[fast]]
slow++
}
}
return slow
};
3.有序数组的平方
思路:因为是有序数组,所以使用双指针,从左右两边开始比较绝对值,将比较大的数的绝对值存入ans中
function sortedSquares(nums: number[]): number[] {
let ans:number[] = []
let left = 0;
let right = nums.length - 1;
for (let i = 0; i < nums.length; i++) {
if (Math.abs(nums[left]) > Math.abs(nums[right])) {
ans.unshift(nums[left++] ** 2)
} else {
ans.unshift(nums[right--] ** 2)
}
}
return ans
};
暴力解法
function sortedSquares(nums: number[]): number[] {
return nums.map(i => i ** 2).sort((a, b) => a - b)
};
4.长度最小的数组
思路:使用滑动窗口,判断窗口内的值是否大于等于target,如果大于,就不断增加left,减少窗口长度直到窗口内的值小于target,不断的与res比较大小。当窗口右边达到数组右边界且窗口长度无法再缩减时结束程序。
function minSubArrayLen(target: number, nums: number[]): number {
let left = 0;
let sum = 0;
let res = nums.length + 1
for (let i = 0; i < nums.length; i++) {
sum += nums[i]
if (sum >= target) {
while (sum - nums[left] >= target) {
sum -= nums[left++]
}
res = Math.min(res, i - left + 1)
}
}
return res == nums.length + 1 ? 0 : res
};