704.二分查找
题目连接:704.二分查找
左闭右闭
left=right是有意义的。定下区间后就要保持循环不变量,每次循环都要保证区间为左闭右闭。
class Solution {
public int search(int[] nums, int target) {
if(target < nums[0] || target > nums[nums.length-1]){
return -1;
}
int left=0;
int right = nums.length-1;
int mid = (left + right)/2;
while(left<=right){
if(nums[mid]<target){
left = mid+1;
mid=(left + right)/2;
}
else if(nums[mid]>target){
right = mid-1;
mid=(left + right)/2;
}
else{
return mid;
}
}
return -1;
}
}
左闭右开
左闭右开时,left=right就没有意义。要注意右边界始终是开区间,即nums[right]一定不等于target。
class Solution {
public int search(int[] nums, int target) {
if(target < nums[0] || target > nums[nums.length-1]){
return -1;
}
int left=0;
int right = nums.length;
int mid = (left + right)/2;
while(left<right){
if(nums[mid]<target){
left = mid+1;
mid=(left + right)/2;
}
else if(nums[mid]>target){
right = mid;
mid=(left + right)/2;
}
else{
return mid;
}
}
return -1;
}
}
27.移除元素
双指针法
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
快慢指针法(双指针)
定义:
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0;
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}