[ 熱題 HOT 100]---33. 搜索旋轉排序數組---二分法

1 題目描述

2 解題思路

  • 方法一:暴力法(Brute Force)
    無視題目“你的算法時間複雜度必須是 O(\log n)O(logn) 級別”這項要求,採用線性掃描的方式搜索。

  • 方法二:二分查找(Binary Search)
    在這裏插入圖片描述

原文連接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/er-fen-fa-python-dai-ma-java-dai-ma-by-liweiwei141/

3 解決代碼

  • 方法一:暴力法(Brute Force)《Java代碼》
public class Solution {
    
    public int search(int[] nums, int target) {
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            if (nums[i] == target) {
                return i;
            }
        }
        return -1;
    }
}

  • 方法二:二分查找(Binary Search)《Java代碼》
class Solution {
    public int search(int[] nums, int target) {
        int len = nums.length;
        if(len == 0){
            return -1;
        }
        int left =  0;
        int right = len - 1;
        while(left < right){
            // 使用上取整的中間數,必須在上面的 mid 表達式的括號裏 + 1
            int mid = left + (right - left  + 1) / 2;
            //目標值target在右邊區間,右邊有序
            if(nums[mid] < nums[right]){
                if(nums[mid] <= target && target<= nums[right]){
                    // 下一輪搜索區間是 [mid, right]
                    left = mid;
                }
                else{
                    // 只要上面對了,這個區間是上面區間的反面區間,下一輪搜索區間是 [left, mid - 1]
                    right = mid - 1;
                }
            }
            else{
                //爲了保證mid的一致性,我們設left到mid-1 有序,實際上是到mid的
                //當區間只有 2 個元素的時候 int mid = (left + right + 1) >>> 1; 一定會取到右邊
                // 此時 mid - 1 不會越界,就是這麼剛剛好
                if(nums[left] <= target &&target <= nums[mid - 1]){
                    // 下一輪搜索區間是 [left, mid - 1]
                    right = mid - 1;
                }
                else{
                    //下一輪搜索區間是 [mid, right]
                    left = mid;
                }
            }
        }
        // 跳出循環後,有可能區間內不存在目標元素,因此還需做一次判斷
        if(nums[left] == target){
            return left;
        }
        return -1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章