Leetcode 第153題:Find Minimum in Rotated Sorted Array-- 旋轉數組找最小值(C++、Python)

題目地址:Evaluate Reverse Polish Notation


題目簡介:

假設按照升序排序的數組在預先未知的某個點上進行了旋轉。( 例如,數組 [0,1,2,4,5,6,7] 可能變爲 [4,5,6,7,0,1,2] )。

請找出其中最小的元素,假設數組中不存在重複元素。

示例 1:     輸入: [3,4,5,1,2]     輸出: 1

示例 2:     輸入: [4,5,6,7,0,1,2]     輸出: 0

題目解析:

1、簡單法:

只要出現前一個大於後一個,那麼後一個便是最小值。

C++:

class Solution {
public:
    int findMin(vector<int>& nums) {
        for (int i = 0; i < nums.size() - 1; i++)
        {
            if (nums[i] > nums[i + 1])
                return nums[i + 1];
        }
        return min(nums.back(), nums[0]);
    }
};

Python:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        for i in range(len(nums) - 1):
            if nums[i] > nums[i + 1]:
                return nums[i + 1]
        return min(nums[-1], nums[0])

2、二分:

假設每次開始都可以確定開頭、結尾和中間位置,用例1說明。(3 < 5 > 2),說明最小值在後半部分,反之在前半部分,只要中間位置和前面的位置不重疊,就可以一直縮小區間。只要找到最小的區間,只有一個數或者兩個數,進行比較即可。

C++:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int start = 0, last = nums.size() - 1;
        int mid = (start + last) / 2;
        while(mid != start)
        {
            if (nums[mid] > nums[last])
            {
                start = mid;
                mid = (start + last) / 2;
            }
            else
            {
                last = mid;
                mid = (start + last) / 2;
            }
        }
        return min(nums[last], nums[mid]);
    }
};

Python:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        start = 0
        last = len(nums) - 1
        mid = (start + last) // 2
        while(mid != start):
            if (nums[mid] > nums[last]):
                start = mid;
                mid = (start + last) // 2
            else:
                last = mid
                mid = (start + last) // 2
        return min(nums[last], nums[mid])

 

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