二分查找及其延伸

1.基本概念

二分查找就是將查找的鍵和子數組的中間鍵作比較,如果被查找的鍵小于中間鍵,就在左子數組繼續查找;如果大于中間鍵,就在右子數組中查找,否則中間鍵就是要找的元素。
遞歸法

   public int binarySeach(int[] nums, int left, int right, int target){
        if(left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] > target) {
                return binarySeach(nums, left, mid - 1, target);
            } else {
                return binarySeach(nums, mid + 1, right, target);
            }
        }else{
            return -1;
        }
    }

非遞歸法

    public int binarySearch1(int[] nums, int target){
        int left = 0,right = nums.length-1;
        while (left <= right){
            int mid = (left + right)/2;
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid] > target){
                right = mid-1;
            }else{
                left = mid+1;
            }
        }
        return -1;
    }

2. Find Minimum in Rotated Sorted Array(Leetcode153)

有序旋轉數組尋找最小值

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.
思路:

class Solution {
    public int findMin(int[] nums) {
        if(nums.length == 0){
            return -1;
        }
        int low = 0, high = nums.length-1;
        while(low < high){
            if(nums[low] < nums[high]){
                return nums[low];
            }
            int mid = (low + high)/2;
            if(nums[mid]>=nums[low]){
                low = mid+1;
            }else{
                high = mid;
            }   
        }
        return nums[low];
    }
}

3. Search in Rotated Sorted Array(Leetcode 33)

有序旋轉數組里尋找固定的一個值

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.

思路:

class Solution {
    public int search(int[] nums, int target) {
        int low =0, high = nums.length-1;
        while(low <= high){
            int mid = (low +high)/2;
            if(nums[mid] == target){
                return mid;
            }
            if(nums[low]<=nums[mid]){
                if(nums[low]<=target && target<nums[mid]){
                    high = mid-1;
                }else{
                    low = mid+1;
                }
            }else{
                if(nums[high]>=target && nums[mid]<target){
                    low = mid+1;
                }else{
                    high = mid-1;
                }
            }
        }
        return -1;
        
        
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容