题目链接:704. 二分查找
视频讲解:B站:手把手带你撕出正确的二分法
文章讲解:代码随想录
思路:这道题目的前提是有序数组,同时还强调了数组中没有重复元素。如果有重复元素,则使用二分查找返回的元素下标可能不唯一。二分查找的前提条件为有序、无重复。
class Solution {
public int search(int[] nums, int target) {
// //左闭右闭
// int left = 0,right = nums.length - 1;
// while(left <= right){
// int mid = left + (right - left) / 2;
// if(nums[mid] < target) left = mid + 1;
// else if(nums[mid] > target) right = mid - 1;
// else return mid;
// }
//左闭右开
int left = 0,right = nums.length;
while(left < right){
int mid = left + (right - left) / 2;
if(nums[mid] < target) left = mid + 1;
else if(nums[mid] > target) right = mid;
else return mid;
}
return -1;
}
}
题目链接:27. 移除元素
思路:
暴力法:首先使用一个for 进行数组的循环,然后使用另一个for进行更新数组,进行覆盖
双指针法:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
class Solution {
public int removeElement(int[] nums, int val) {
// //暴力法
// int size = nums.length;
// //第一个for循环数组
// for(int i = 0;i < size;i ++){
// if(nums[i] == val){
// //第一个for更新数组
// for(int j = i + 1;j < size;j ++){
// nums[j - 1] = nums[j];//覆盖,不是删除
// }
// i --;
// size --;
// }
// }
// return size;
//双指针
int slow = 0;
for(int fast = 0;fast < nums.length;fast ++){
if(nums[fast] != val){
nums[slow ++] = nums[fast];
}
}
return slow;
}
}