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];
    }
};

你可能感兴趣的:(LeetCode,C++,算法,二分法,数组)