算法练习Day1 二分法与快慢指针

发布时间 2023-10-12 00:41:22作者: Fancele

Day1 二分查找两种写法和快慢指针

//左闭右闭的情况,也是我最喜欢的一种写法,可能是因为比较对称 一个mid+1 一个mid—1 直接写就行,要注意左闭右闭和左闭右开的区别
class Solution {
public:
   int search(vector<int>& nums, int target) {
       int l=0;
       int r = nums.size()-1;
       while(l<=r){
           int mid = l+((r-l)>>1); //注意这里要多加个括号,不然不知道为啥超时无法通过
           if(target<nums[mid]){
               r=mid-1;
          }else if(target>nums[mid]){
               l=mid+1;
          }else {
               return mid;
          }
      }
       return -1;
  }
};
//左闭右开的想法,好好想一下为什么是l<r时以及为什么r直接=mid
class Solution {
public:
   int search(vector<int>& nums, int target) {
       int l=0;
       int r = nums.size();
       while(l<r){
           int mid = l+((r-l)>>1);
           if(target<nums[mid]){
               r=mid;
          }else if(target>nums[mid]){
               l=mid+1;
          }else {
               return mid;
          }
      }
       return -1;
  }
};
//双指针的使用十分十分常见,比如判断链表是否有环,龟兔赛跑,找中点等等,随便写写就行。
class Solution {
public:
   int removeElement(vector<int>& nums, int val) {
       int slowpivot=0;
       for(int fastpivot=0;fastpivot<nums.size();fastpivot++){
           if(nums[fastpivot]!=val){
               nums[slowpivot++]=nums[fastpivot];
          }
      }
       return slowpivot;
  }
};