劍指 Offer II 二分查詢
阿新 • • 發佈:2022-03-25
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組第一個數 } };