LeetCode - 153. Find Minimum in Rotated Sorted Array - 思路詳解- C++

題目

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

翻譯

假設,一個數組,按照升序排列,然後被該數組可能經過k步的旋轉。
找出其中最小的元素。可以假設,數組中不存在兩個相同的數

思路

思路1,暴力法,遍歷一遍。
思路2,採用二分法。
首先定義兩個遊標,index1,index2。

  • 1.如果num[index1] > num[index2]則說明,存在斷點。即4,5,6,0,1,2,3。即0處爲斷點也就是最小的值。
  • 2,如果num[index1] < num[index2]則說明,最小值就是num[index1]。
  • 3,對第一種情況在進行分析,假設【4,5,6,0,1,2,3】。我們把4,5,6當做第一組,0,1,2,3作爲第二組,則mid = (index1+index2)/2;
    • 1,如果num[mid] > num[index1] 則說明,mid在第一組中。則最小值,必然在mid之後,即start = mid+1;如果num[mid] < num[index1]則說明,mid在第二組中。則說明最小值在mid之前。即end = mid-1.
    • 2,如果num[mid] > num[index2],則mid在第一組中,即最小值在mid之後。start = mid+1;如果num[mid] < num[index2],則說明mid在第二組中,即最小值在mid之前。end = mid-1;

代碼

class Solution {
public:
    int findMin(vector<int>& nums) {
        int index1 = 0;
        int index2 = nums.size()-1;
        int indexMid = index1;
        while(nums[index1] >= nums[index2]){
            if(index2 - index1 == 1 || index1 == index2){
                indexMid = index2;
                break;
            }

            indexMid = (index1+index2)/2;
            //mid在第一個序列中
            if(nums[indexMid] >= nums[index1]){
                index1 = indexMid;
            //mid在第二個序列中
            }else if(nums[indexMid] <= nums[index2]){
                index2 = indexMid;
            }
        }

        return nums[indexMid];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章