1 二分查找
1.1 左闭右闭 [left,right]
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length -1; // [0,length -1]
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
while(left <= right){ //[left, right] [1,1]
int mid = (right - left)/2 + left; //防止数组越界(位运算也可以)
//int mid = left + ((right - left) >> 1);
if( target < nums[mid] ) {
right = mid - 1; //[left, mid -1]
}else if( target > nums[mid] ){
left = mid + 1; //[mid + 1, right]
}else if( target == nums[mid] ){
return mid;
}
}
return -1;
}
}
1.2 左闭右开 [left, right)
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length; //[0,length)
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
while(left < right){ //[left, right) [1,1)不合法取不到
int mid = (right - left)/2 + left;
if( target < nums[mid] ) {
right = mid; //[left,mid)
}else if( target > nums[mid] ){
left = mid + 1; //[mid+1,right)
}else if( target == nums[mid] ){
return mid;
}
}
return -1;
}
}
2. 移除元素 - 快慢指针法
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
for(int fastIndex = 0; fastIndex < nums.length; fastIndex++){
if(nums[fastIndex] != val){
nums[slowIndex] = nums[fastIndex];
slowIndex ++;
}
}
return slowIndex;
}
}