数组-2.二分查找
方法1-左闭右闭区间
class Solution {
public:
int search(vector<int>& nums, int target) {
//二分查找法,左闭右闭
int leftindex = 0;
int rightdex = nums.size() - 1;
int middle;
while(leftindex <= rightdex ){
//middle = (leftindex + rightdex) / 2; //两个int相加可能会造成int类型越界问题
//也可以使用middle = leftindex + ((rightdex - leftindex) >> 1);
middle = leftindex + (rightdex - leftindex) / 2;
if(nums[middle] > target){
rightdex = middle - 1;
}else if(nums[middle] < target){
leftindex = middle + 1;
}else{
return middle;
}
}
return -1;
}
};
方法2-左闭右开区间
class Solution {
public:
int search(vector<int>& nums, int target) {
//二分查找法,左闭右开
int leftindex = 0;
int rightdex = nums.size();
int middle;
while(leftindex < rightdex){
middle = leftindex + (rightdex - leftindex) / 2;
if(nums[middle] > target){
rightdex = middle;
}else if(nums[middle] < target){
leftindex = middle + 1;
}else{
return middle;
}
}
return -1;
}
};
数组-3.移除元素
双指针法-快慢指针法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//双指针法-快慢指针法
int slowindex = 0;
for(int fastindex = 0;fastindex < nums.size();fastindex++){
if(nums[fastindex] != val){
nums[slowindex] = nums[fastindex];
slowindex++;
//可以简写成这样:nums[slowindex++] = nums[fastindex];
}
}
return slowindex;
}
};
双指针法-双向指针法
注意点:&&,两边使用规则:左边的优先级要高一点,即左边同时是右边的条件
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int leftindex = 0;
int rightindex = nums.size() - 1;
while(leftindex <= rightindex){
//这里顺序不能调换,会出错,比如只有nums[]=[1]时,第一次是满足的,第二次再次执行时,nums[1]就不存在,所以肯定会报错
while(leftindex <= rightindex && nums[leftindex] != val){
leftindex++;
}
while(leftindex <= rightindex && nums[rightindex] == val){
rightindex--;
}
if(leftindex < rightindex){
nums[leftindex++] = nums[rightindex--];
}
}
return leftindex;
}
};