704. 二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int middle = 0;
while(left <= right){
middle = left+(right-left)/2;//(left + right) / 2;
if(nums[middle] == target)
return middle;
else if(nums[middle] > target)
right = middle - 1;
else
left = middle + 1;
}
return -1;
}
};
35. 搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int middle = 0;
while(left <= right){
middle = left + (right - left)/2;
cout << middle << endl;
if(nums[middle] == target)
return middle;
else if(nums[middle] > target)
right = middle - 1;
else
left = middle + 1;
}
cout << "left:" << left << ", right:" << right << endl;
return left;
}
};
34. 在排序数组中查找元素的第一个和最后一个位置
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int middle = 0;
bool left_stop = false;
bool right_stop = false;
while(left <= right){
middle = left + (right - left)/2;
if(nums[middle] == target)
break;
else if(nums[middle] > target)
right = middle - 1;
else
left = middle + 1;
}
if(left > right)
return vector<int>{-1, -1};
left = right = middle;
cout << middle << endl;
//向左向右寻找不是target就停止
while(!left_stop || !right_stop){
if(left - 1 >= 0 && nums[left - 1] == target)
left--;
else
left_stop = true;
if(right + 1 < nums.size() && nums[right + 1] == target)
right++;
else
right_stop = true;
}
return vector<int>{left, right};
}
};
27. 移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
vector<int>::iterator it;
for(it=nums.begin();it!=nums.end();){
if(*it == val)
nums.erase(it);
else
it++;
}
return nums.size();
}
};
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//双指针,指针i和指针j都是在一次for循环里面++,j只有在i指向的值跳过后再++
int i = 0;
int j = 0;
for(;i< nums.size(); i++){
if(nums[i] != val)
nums[j++] = nums[i];
}
return j;
}
};