704.二分查找
思路:二分查找,左闭右闭和左闭右开,使用二分查找的前提是有序数组,且元素不重复。
左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int size = nums.size();
if(!size) return -1;
int left = 0, right = size-1;
while(left <= right){
int mid = left + (right-left)/2 ;
if(nums[mid] > target){
right = mid-1;
}
else if(nums[mid] < target){
left = mid+1;
}
else{
return mid;
}
}
return -1;
}
};
左闭右开
右边界取不到,初始化时赋值为size。
class Solution {
public:
int search(vector<int>& nums, int target) {
int size = nums.size();
if(!size) return -1;
int left = 0, right = size;
while(left < right){
int mid = left + (right-left)/2 ;
if(nums[mid] > target){
right = mid;
}
else if(nums[mid] < target){
left = mid+1;
}
else{
return mid;
}
}
return -1;
}
};
27. 移除元素
思路:题目要求不能使用额外空间,可以采用双指针法
最后返回慢指针就可以,因为慢指针最后的值指向的是最终数组的后一位。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
if(!size) return 0;
int l = 0, r = 0;
for(l; l<size; l++){
if(nums[l] != val){
nums[r] = nums[l];
r++;
}
}
return r;
}
};