各種二分查找算法總結

1. 最基本的二分查找算法:

在已排好序的vector中查找是否存在target

bool findData(vector<int> &nums, int target){
	if(nums.size()==0)
		return false;
	int low=0;
	int high=nums.size()-1;
	int mid;
	while(low<=high){
		mid=(low+high)>>1;
		if(nums[mid]==target)
			return true;
		else if(nums[mid]<target){
			low=mid+1;
		}
		else{
			high=mid-1;
		}
	}
	return false;
}

2. 將已排好序的數組轉動後,找出最小節點:

假設數組中不存在重複元素

    int findMin(vector<int>& nums) {
        int len=nums.size();
        if(len==1)
            return nums[0];
        if(nums[0]<nums[len-1])
            return nums[0];
            
        int low=0, high=len-1, mid;
        
        while(low<high){
            mid=(low+high)>>1;
            if(high-low==1)
                break;
            if(nums[mid]>nums[low])
                low=mid;
            else if(nums[mid]<nums[high])
                high=mid;
        }
        return nums[high];
    }
假設數組中存在相同元素
    int findMin(vector<int>& nums) {
        int len=nums.size();
        if(len==1)
            return nums[0];
        if(nums[0]<nums[len-1])
            return nums[0];
        
        int low=0, high=len-1, mid;
        while(low<high){
            mid=(low+high)>>1;
            if(high-low==1)
                break;
            if(nums[mid]>nums[low]){//這裏主要需要考慮這種情況:10, 1, 10, 10, 10
                if(nums[low]<nums[high])
                    high=mid;
                else
                    low=mid;
            }
            else if(nums[mid]<nums[high]){
                high=mid;
            }
            else 
                low++;
        }
        return min(nums[high], nums[low]);
    }

3. 將排好序的數組移動後,在其中查找target元素

數組中不存在重複元素

    int search(vector<int>& nums, int target) {
        int len=nums.size();
        if(len==0)
            return -1;
        int low=0;
        int high=len-1;
        int mid;
        while(low<=high){
            mid=(low+high)>>1;
            if(nums[mid]==target)
                return mid;
            else if(nums[mid]>=nums[low]){//兩次都是跟nums[low]比較
                if(target<nums[mid] && target>=nums[low])
                    high=mid-1;
                else
                    low=mid+1;
            }
            else if(nums[mid]<nums[low]){
                if(target>nums[mid] && target<=nums[high])
                    low=mid+1;
                else
                    high=mid-1;
            }
        }
        return -1;
    }
如果數組中存在相同元素
    bool search(vector<int>& nums, int target) {
        if(nums.size()==0)
            return false;
        int low=0;
        int high=nums.size()-1;
        int mid;
        while(low<=high){
            mid=(low+high)>>1;
            if(nums[mid]==target)
                return true;
            if(nums[mid]>nums[low]){
                if(target<nums[mid]&&target>=nums[low])
                    high=mid-1;
                else
                    low=mid+1;
            }
            else if(nums[mid]<nums[low]){
                if(target>nums[mid]&&target<=nums[high])
                    low=mid+1;
                else
                    high=mid-1;
            }
            else//根以上解法的唯一差別
                low++;
        }
        return false;
    }



發佈了90 篇原創文章 · 獲贊 17 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章