关于二分查找的相关问题

来源:互联网 发布:android 聚合数据 编辑:程序博客网 时间:2024/05/17 01:03

Search Insert Position

class Solution {public:    int searchInsert(vector<int>& nums, int target) {        int beg=-1,end=nums.size();        while(beg+1<end){            int mid=beg+(end-beg)/2;            if(nums[mid]==target)return mid;            else if(target>nums[mid])beg=mid;            else end=mid;        }        return end;    }};


查到目标点所在区间 in soreted array

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        vector<int>ret(2,-1);        if(nums.empty())return ret;        int beg=-1,end=nums.size();        while(beg+1<end){            int mid=beg+(end-beg)/2;            if(nums[mid]<target)beg=mid;            else end=mid;        }        if(end<nums.size()&&nums[end]==target)ret[0]=end;        else return ret;        end=nums.size();        while(beg+1<end){            int mid=beg+(end-beg)/2;            if(target<nums[mid])end=mid;            else beg=mid;        }        ret[1]=beg;        return ret;    }};

查找最小值(序列元素互异)in rotated sorted array

class Solution {public:    int findMin(vector<int>& nums) {        if(nums.empty())return -1;        int beg=0,end=nums.size()-1;        while(beg+1<end){            int mid=beg+(end-beg)/2;            if(nums[mid]>nums[end])beg=mid;            else end=mid;        }        return nums[beg]<nums[end]?nums[beg]:nums[end];    }};

查找最小值(存在相同值)in rotated sorted array

class Solution {public:    int findMin(vector<int>& nums) {         if(nums.empty())return -1;        int beg=0,end=nums.size()-1;        while(beg+1<end){            int mid=beg+(end-beg)/2;            if(nums[mid]<nums[end])                end=mid;            else if(nums[mid]>nums[end]) beg=mid;            else --end;        }        return nums[beg]<nums[end]?nums[beg]:nums[end];    }};

Search in Rotated Sorted Array 元素互异

class Solution {public:    int search(vector<int>& nums, int target) {        if(nums.empty())return -1;        int low=0,high=nums.size()-1;        while(low+1<high){            int mid=low+(high-low)/2;            if(target==nums[mid])return mid;            if(nums[mid]>=nums[low]){                if(target>=nums[low] && target<nums[mid])high=mid;                else low=mid;            }else{                if(target>nums[mid]&&target<=nums[high])low=mid;                else high=mid;            }        }        if(nums[low]==target)return low;        else if(target==nums[high])return high;        else return -1;    }};

Search in Rotated Sorted Array II 元素可能存在相同值

class Solution {public:    bool search(vector<int>& nums, int target) {        if(nums.empty())return false;        int beg=0,end=nums.size()-1;        while(beg+1<end){            int mid=beg+(end-beg)/2;            if(target==nums[mid])return true;            if(nums[mid]>nums[beg]){                if(target>=nums[beg]&&target<nums[mid])end=mid;                else beg=mid;            }else if(nums[mid]<nums[beg]){                if(target>nums[mid]&&target<=nums[end])beg=mid;                else end=mid;            }else{++beg;}        }        if(nums[beg]==target || nums[end]==target)return true;        else return false;    }};