C++ 二分法查找循環有序數組最小值

題目:使用二分法查找循環有序數組的最小值。
int getSubScriptFromArray(int arr[], int left, int right){
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] >arr[right]) {
            //左邊有序, 最小值在右邊,不包含mid
            left = mid + 1;
        } else if (arr[mid] < arr[right]) {
            // 右邊有序, 最小值在左邊,可能是mid
            right = mid;
        } else{
            right = right - 1;
        }
    }
    return arr[left];
}
擴展一:

二分法查找循環有序數組中的某一元素,如果存在返回該值,否則返回 -1。

int getNumFromLooOrderArray(int arr[], int target, int left, int right) {
    cout<<"len: "<< getArrayLen(arr) << endl;
    while (left < right) {
        int mid = left + (right - left) / 2;
         cout<<"left: " << left << " right: " << right << endl;
        if (arr[mid] == target) {
            return arr[mid];
        }
        if (arr[mid] < arr[right]) {
            if (target > arr[mid] && target < arr[right]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
            if (target > arr[right]) {
                right = mid - 1;
            }
        } else{
             // mid 左邊有序
            if (target < arr[mid] && target > arr[left]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
    }
    if (target == arr[left]) {
        return arr[left];
    }
    return -1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章