目录
一、二分查找
力扣704
https://leetcode.cn/problems/binary-search/
分为左闭右闭和左闭右开两种情况。
时间复杂度:O(logn)
空间复杂度:O(1)
1.左闭右闭
初始时left=0,right=nums.size()-1。left和right的修改规则为left=middle+1,right=middle-1。此时最后一步存在left=right的情况,因此在做while循环边界判断时应置为while(left<=right)循环退出时,left=right。
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int middle = (left + right) / 2;
while(left <= right){
if(nums[middle] < target){
left = middle + 1;
middle = (left + right) / 2;
}else if(nums[middle] > target){
right = middle - 1;
middle = (left + right) / 2;
}else if(nums[middle] == target){
return middle;
}
}
return -1;
}
2.左闭右开
与左闭右闭的区别是初始时left=0,right=nums.size(),left和right的修改规则改为left=middle+1,right=middle。此时最后一步不存在left=right的情况,因此在做while循环边界判断时应置为while(left<right),循环退出时,left=right+1。
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
int middle = (left + right) / 2;
while(left < right){
if(nums[middle] < target){
left = middle + 1;
middle = (left + right) / 2;
}else if(nums[middle] > target){
right = middle - 1;
middle = (left + right) / 2;
}else if(nums[middle] == target){
return middle;
}
}
return -1;
}
二、移除元素
力扣27
https://leetcode.cn/problems/remove-element/
双指针法。对于要移除的元素val,可以设置相向的两个指针left(数组开头)和right(数组末尾),left指针从左向右移,right从右向左移。left指针先移动,当nums[left]=val的时候,left停止移动,right开始移动,当nums[right]!=val的时候,right停止移动,然后令nums[left]=nums[right],left++,right--,重复上述步骤直到left>right。
该方法会导致数组中元素顺序发生变化。
时间复杂度:O(n)
空间复杂度:O(1)
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while(left <= right){
while(left <= right && nums[left] != val){
left++;
}
while(left <= right && nums[right] == val){
right--;
}
if(left < right){
nums[left] = nums[right];
left++;
right--;
}
}
return left;
}