二分查找法与双指针移动元素

发布时间 2024-01-10 19:04:55作者: 云撤~

这道题我用的是双指针法,left,right。通过while循环将目标元素全部放后面,left所代表下标就是剩余个数。但是最开始遇到了问题

点击查看代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
     
int n=nums.size();
int left=0;int right=n-1;
while(left<=right){
if(nums[left]!=val){++left;}
 if(nums[right]==val){--right;}
else if(nums[left]==val&&nums[right]!=val){
    int temp=nums[left];
    nums[left]=nums[right];
    nums[right]=temp;
    }

}
   int count=n-left;
    for(int i=0;i<count;i++){
        nums.pop_back();
    }    
return left;
    }
};
点击查看代码
while(left<=right){
if(nums[left]!=val){++left;}
 if(nums[right]==val){--right;}
else if(nums[left]==val&&nums[right]!=val){
    int temp=nums[left];
    nums[left]=nums[right];
    nums[right]=temp;
    }

}
通过debug发现问题出在这里。原本打算每一此while循环只执行一次操作,但是这两个if是都会执行的,在最后一步时,即使left>right,它还会进行一次交换从而出错,所以应该用else if。

二分查找法,通过学习有了更加深刻体会。

点击查看代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
int n=nums.size();
int left=0;int right=n-1;
while(left<=right){
    int mid=(left+right)/2;
    if(nums[mid]<target){left=mid+1;}
    if(nums[mid]>target){right=mid-1;}
    if(nums[mid]==target){return mid;}
}
return -1;
    }
};
其中关键的两点,一个是while,一个是mid的处理。 主要是括号边界的开闭造成的差异。 可以通过[1,1)这种方式来判断怎么处理。 这种形式肯定不存在吗,所以while就不能有等号,其次右边本身就不会取,所以 if(nums[mid]>target){right=mid;}直接right=mid就行。