// 演算法：用二分搜尋找旋轉排序陣列的最小值（含重複元素版本）。
// Algorithm: binary search for the minimum in a rotated sorted array with duplicates.
// 比較 nums[mid] 與 nums[hi]：大則答案在右半；小則答案在左半（含 mid）；相等則 hi--。
// Compare nums[mid] to nums[hi]: greater → right half; less → left half (incl. mid); equal → hi--.

int findMin(int* nums, int numsSize) {
    int lo = 0;                          // 左指針，搜尋區間左端 / left pointer of search range
    int hi = numsSize - 1;               // 右指針，搜尋區間右端 / right pointer of search range

    while (lo < hi) {                    // 當區間還有至少兩個元素時繼續 / loop while range has 2+ elements
        int mid = lo + (hi - lo) / 2;    // 取中點，這寫法避免 lo+hi 溢位 / midpoint; avoids lo+hi overflow

        if (nums[mid] > nums[hi]) {      // 中點比右端大，代表最小值一定在 mid 右邊 / mid is in the "high" segment; min must be to the right
            lo = mid + 1;                // 丟掉左半含 mid / drop left half including mid
        } else if (nums[mid] < nums[hi]) {
                                         // 中點比右端小，最小值在左半，但 mid 自己也可能是答案 / min is in left half; mid itself might be the answer
            hi = mid;                    // 所以 hi 移到 mid（不是 mid-1）/ so hi = mid (NOT mid-1, or we'd skip the answer)
        } else {                         // nums[mid] == nums[hi]：有重複，無法判斷哪半 / duplicates: cannot decide which half
            hi--;                        // 安全地丟掉一個元素，最小值不會丟失 / safely shrink by one; min is preserved because nums[mid] == nums[hi]
        }
    }

    return nums[lo];                     // 迴圈結束時 lo == hi，指向最小值 / when loop ends lo == hi and points to the minimum
}
