題目地址: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])