704. 二分查找
经典1[ , ]:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
if(nums[left]==target) return left;
if(nums[right]==target) return right;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]<target) left=mid+1;
else if(nums[mid]>target) right=mid-1;
else return mid;
}
return -1;
}
};
经典2[ , ):
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;int right=nums.size();//[left,right)
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]<target){
left=mid+1;// target 在右区间,在[middle + 1, right)中
}
else if(nums[mid]>target){
right=mid;// target 在左区间,在[left, middle)中
}
else
return mid;
}
return -1;
}
};
27. 移除元素
需注意fast起始为0;双指针。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
if(nums.size()==0) return 0;
int slow=0;
int fast=0;
while(fast<nums.size()){
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
fast++;
}
return slow;
/*
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;*/
}
};
34. 在排序数组中查找元素的第一个和最后一个位置
34. Find First and Last Position of Element in Sorted Array
分成三种情况。得出LeftBorder,RightBorder,此时nums[Border] != target,需要+1/-1操作。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int leftBorder = getLeftBorder(nums, target);
int rightBorder = getRightBorder(nums, target);
// 情况一 target 在数组范围的右边或者左边
if (leftBorder == -2 || rightBorder == -2) return {-1, -1};
// 情况三 target 在数组范围中,且数组中存在target,
if (rightBorder - leftBorder > 1) return {leftBorder + 1, rightBorder - 1};
// 情况二 target 在数组范围中,且数组中不存在target,
return {-1, -1};
}
/*getRightBorder */
int getRightBorder(vector<int>& nums, int target){
int left = 0;
int right = nums.size() - 1;
int rightBorder = -2; // 记录一下rightBorder没有被赋值的情况
while(left<=right){
int mid=left+((right-left)/2);
if(nums[mid]>target)
right=mid-1;
else{// nums[mid]<=target 寻找右边界,nums[middle] == target的时候更新left
left=mid+1;
rightBorder=left;
}
}
return rightBorder;
}
/*getLeftBorder */
int getLeftBorder(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int leftBorder = -2; // 记录一下leftBorder没有被赋值的情况
while (left <= right) {
int middle = left + ((right - left) / 2);
if (nums[middle] >= target) { // 寻找左边界,nums[middle] == target的时候更新right
right = middle - 1;
leftBorder = right;
} else {
left = middle + 1;
}
}
return leftBorder;
}
};