704. 二分查找 27. 移除元素 977.有序数组的平方
704. 二分查找
二分查找使用前提:
1.有序数组
2. 数组中无重复元素
大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
function search(nums: number[], target: number): number {
let left = 0;
let right = nums.length - 1;
while(left <= right){
let middle = left + Math.floor((right - left) / 2);
if(nums[middle] === target) return middle;
if(nums[middle] < target){
left = middle + 1;
} else {
right = middle - 1;
}
}
return -1;
};
function search(nums: number[], target: number): number {
let left = 0;
let right = nums.length;
while(left < right){
let middle = left + Math.floor((right - left) / 2);
if(nums[middle] === target) return middle;
if(nums[middle] < target){
left = middle + 1;
} else {
right = middle;
}
}
return -1;
};
27. 移除元素
双指针法
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
function removeElement(nums: number[], val: number): number {
let point1 = 0;
for(let point2 = 0; point2 < nums.length; point2++){
if(nums[point2] !== val){
nums[point1++] = nums[point2];
}
}
return point1;
};
977.有序数组的平方
双指针法
function sortedSquares(nums: number[]): number[] {
let left = 0, right = nums.length - 1;
let result = []
while(left <= right){
if(Math.abs(nums[left]) > Math.abs(nums[right])){
result.unshift(nums[left] * nums[left]);
left++;
} else {
result.unshift(nums[right] * nums[right]);
right--;
}
}
return result;
};
function sortedSquares(nums: number[]): number[] {
return nums.map(n => n*n).sort((a,b) => a - b);
};