1. 程式人生 > 實用技巧 >LeetCode 81 搜尋旋轉排序陣列II

LeetCode 81 搜尋旋轉排序陣列II

LeetCode81 搜尋旋轉排序陣列II

題目描述

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。

編寫一個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。

樣例

輸入: nums = [2,5,6,0,0,1,2], target = 0
輸出: true
輸入: nums = [2,5,6,0,0,1,2], target = 3
輸出: false

演算法分析

  • 掃描
  • 二分 先刪除

時間複雜度

掃描\(O(n)\)

二分\(O(n)\)最壞情況下

Java程式碼

class Solution {
    public boolean search(int[] nums, int target) {
        for(int i = 0; i < nums.length; i ++) {
            if(nums[i] == target){
                return true;
            }
        }

        return false;
    }
}
class Solution {
    public boolean search(int[] nums, int target) {
        if(nums.length == 0) return false;
        int R = nums.length - 1;
        while( R >=0 && nums[R] == nums[0]) R--;
        if(R < 0){
            return nums[0] == target;
        }

        int l = 0;
        int r = R;

        while(l < r){
            int mid = l + r + 1 >> 1;
            if(nums[mid] >= nums[0]) l = mid;
            else r = mid - 1;
        }

        if(target >= nums[0]){
            r = l;
            l = 0;
        }
        else{
            l++;
            r = R;
        }

        while(l < r) {
            int mid = l + r >> 1;
            if(nums[mid] >= target) r = mid;
            else l = mid + 1;
        }

        return nums[r] == target;
    }
}