leetcode--二分查找和二分排序

来源:互联网 发布:淘宝话费充值店赚钱吗 编辑:程序博客网 时间:2024/06/07 19:51

基础知识

二分查找(递归)代码

#include <vector>using namesape std;bool binary_search(vector<int> &sort_array,int begin, int end, int target){    if(begin>end){        return false;    }    int mid=(begin+end)/2;    if(target==sort_array[mid]){        return true;    }    else if(target<sort_array[mid]){        return binary_search(sort_array,begin,mid-1,target);    }    else if(target>sort_array[mid]){        return binary_search(sort_array,mid+1,end,target);    }}

二分查找(循环)代码

bool binary_search(std::vector<int> &sort_array, int target){    int begin = 0;    int end = sort_array.size() - 1;    while(begin <= end){        int mid = (begin + end) / 2;        if (target == sort_array[mid]){            return true;        }        else if (target < sort_array[mid]){            end = mid - 1;        }        else if (target > sort_array[mid]){            begin = mid + 1;        }    }    return false;}

leetcode题目

35. Search Insert Position

题意:

给出一个递增序列,和一个target数字,找到这个数字在递增序列中的插入位置,使插入之后还是有序。

解题思路:

普通的二分查找,要注意边界条件。

代码:

class Solution {public:    int searchInsert(vector<int>& nums, int target) {        int begin=0;        int end=nums.size()-1;        int index=-1;        while(index==-1){            int mid=(begin+end)/2;            if(nums[mid]==target){                index=mid;            }            else if(nums[mid]>target){                if(mid==0||target>nums[mid-1]){   //注意边界的情况                     index=mid;                }                end=mid-1;            }            else if(nums[mid]<target){                if(mid==nums.size()-1||target<nums[mid-1]){  //注意边界的情况                    index=mid+1;                }                begin=mid+1;               }        }        return index;    }};

34. Search for a Range

题意:

递增序列中的元素可能重复,找到target在递增序列中的range,如果不存在输出[-1,-1]

解题思路:

用两个二分查找,分别找出左界限和右界限。

代码:

int searchLeft(vector<int>& nums,int target){    int begin=0;    int end=nums.size()-1;    while(begin<=end){        int mid=(begin+end)/2;        if(nums[mid]==target){            if(mid==0||nums[mid-1]<target){                return mid;            }            end=mid-1;        }        else if(nums[mid]<target){            begin=mid+1;        }        else if(nums[mid]>target){            end=mid-1;        }    }    return -1;}int searchRight(vector<int>& nums,int target){    int begin=0;    int end=nums.size()-1;    while(begin<=end){        int mid=(begin+end)/2;        if(nums[mid]==target){            if(mid==nums.size()-1||nums[mid+1]>target){                return mid;            }            begin=mid+1;        }        else if(nums[mid]<target){            begin=mid+1;        }        else if(nums[mid]>target){            end=mid-1;        }    }    return -1;}class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        vector<int> result;        result.push_back(searchLeft(nums,target));        result.push_back(searchRight(nums,target));        return result;        }    };

33. Search in Rotated Sorted Array

题意:

在一个旋转数组中找目标元素。

解题思路:

分情况套路的二分查找:

代码:

原创粉丝点击