首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

有序數組循環移位後查找元素:二分查找變體O(log n)解法

     編輯:程式設計綜合問答

問題

有序遞增數組循環右移k位(k未知),查找目標值target的索引,要求O(log n)。

核心思路:二分查找判斷有序半邊

旋轉數組特性:**至少一半是有序的**。

public int search(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) return mid;
        
        // 左半邊有序
        if (nums[left] <= nums[mid]) {
            if (nums[left] <= target && target < nums[mid])
                right = mid - 1; // target在左半邊
            else
                left = mid + 1;  // target在右半邊
        } 
        // 右半邊有序
        else {
            if (nums[mid] < target && target <= nums[right])
                left = mid + 1;  // target在右半邊
            else
                right = mid - 1; // target在左半邊
        }
    }
    return -1;
}

關鍵判斷邏輯

處理重複元素(進階)

若數組含重複值(如[2,2,2,0,1,2]),nums[left]==nums[mid]==nums[right]時無法判斷哪邊有序,需left++/right--縮小範圍,最壞退化O(n)。

複雜度分析

  • 時間:O(log n)(無重複)/ O(n)(全重複)。
  • 空間:O(1)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
條件含義target範圍縮小區間
nums[left] <= nums[mid]左半邊有序[left, mid)在範圍內→right=mid-1,否則left=mid+1
else右半邊有序(mid, right]在範圍內→left=mid+1,否則right=mid-1