首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

LeetCode 33:搜索旋轉排序數組 - 二分查找進階應用

     編輯:關於C

題目描述

給定一個升序排序後在某個未知點旋轉的數組(如 [4,5,6,7,0,1,2]),搜索目標值 target,返回索引,不存在返回 -1。要求 O(log n) 時間複雜度。

核心洞察:部分有序性

旋轉數組雖非整體有序,但分為兩個有序子數組。二分查找關鍵在於判斷 mid 落在哪個有序部分,並據此決定搜索方向。

算法邏輯圖解

數組:[4, 5, 6, 7, 0, 1, 2]
       ↑        ↑     ↑
      left     mid   right

情況 1:nums[mid] >= nums[left] → 左半部分有序
  - 若 target 在 [nums[left], nums[mid]) → right = mid - 1
  - 否則 → left = mid + 1

情況 2:nums[mid] < nums[left] → 右半部分有序
  - 若 target 在 (nums[mid], nums[right]] → left = mid + 1
  - 否則 → right = mid - 1

完整 C++ 實現

class Solution {
public:
    int search(vector& nums, int target) {
        int len = nums.size();
        if (len == 0) return -1;
        if (len == 1) return nums[0] == target ? 0 : -1;

        int left = 0, right = len - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            
            // 早期命中優化
            if (nums[mid] == target) return mid;
            if (nums[left] == target) return left;
            if (nums[right] == target) return right;

            if (nums[mid] >= nums[left]) {  // 左半有序
                if (target > nums[left] && target < nums[mid])
                    right = mid - 1;
                else
                    left = mid + 1;
            } else {  // 右半有序
                if (target > nums[mid] && target < nums[right])
                    left = mid + 1;
                else
                    right = mid - 1;
            }
        }
        return -1;
    }
};

關鍵點總結

  1. 邊界條件:空數組、單元素數組優先處理
  2. 早期返回:檢查 left/right/mid 可減少循環次數
  3. 判斷有序部分:nums[mid] >= nums[left] 是關鍵判斷
  4. 區間開閉:嚴格區分 < 和 ≤,避免死循環
  5. 無重複元素:題目保證無重複,簡化了邏輯

複雜度分析

  • 時間:O(log n) - 標準二分查找
  • 空間:O(1) - 僅使用常數額外空間

擴展思考

  • 若允許重複元素(LeetCode 81),需額外處理 nums[left] == nums[mid] == nums[right] 情況
  • 尋找最小值(LeetCode 153)同理,比較 nums[mid] 與 nums[right]

運行結果

LeetCode 提交結果:Accepted

測試用例全通過,執行時間擊敗 90%+ 提交。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved