1. 程式人生 > 其它 >劍指 Offer II 二分查詢

劍指 Offer II 二分查詢

068. 查詢插入位置

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int l=0,r=nums.size();
        nums.push_back(1000000);//一定有數比target大 它在的位置會是最後一個插入的位置 可以直接return l
        while(l<r)
        {
            int mid=l+r>>1;
            if(nums[mid]>=target)r=mid;
            else l=mid+1;
        }
        return l;

    }
};

069. 山峰陣列的頂部

山峰符合兩段性

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& a) {
         int l=1,r=a.size()-2;
         while(l<r)
         {
             int mid=l+r+1>>1;
             if(a[mid]>a[mid-1])l=mid;
             else r=mid-1;//說明答案嚴格在左側

         }
         return l;
    }
};

070. 排序陣列中只出現一次的數字

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
       /*
       二分的性質是 兩兩看成一組

       target左邊 數都相同 
             右邊 數都不同


       */
       nums.push_back(nums.back()+1);
       int l=0,r=nums.size()/2-1;//組數
       while(l<r)
       {
           int mid=l+r>>1;
           if(nums[mid*2]==nums[mid*2+1])l=mid+1;//在左邊
           else r=mid;
       }
        return nums[2*l];//第l組第一個數
    }
};