1. 程式人生 > 實用技巧 >54尋找旋轉排序陣列中的最小值 II(154)

54尋找旋轉排序陣列中的最小值 II(154)

作者: Turbo時間限制: 1S章節: 二分查詢

晚於: 2020-08-12 12:00:00後提交分數乘係數50%

截止日期: 2020-08-19 12:00:00

問題描述 :

假設我們的陣列是一個按照升序排序的陣列在預先未知的某個點上進行了旋轉得到的。

( 例如,陣列 [3,5,6,0,1,2] ,可以知道是從[0,1,2,3,5,6]旋轉變來的 )。

請找出其中最小的元素。要求使用二分查詢。

注意陣列中可能存在重複的元素。

示例 1:

輸入: [1,3,5]

輸出: 1

示例 2:

輸入: [2,2,2,0,1]

輸出: 0

說明:

這道題是 尋找旋轉排序陣列中的最小值 的延伸題目。

允許重複會影響演算法的時間複雜度嗎?會如何影響,為什麼?

輸入說明 :

首先輸入陣列的長度n,然後輸入n個整數

輸出說明 :

輸出一個整數

輸入範例 :

輸出範例 :

#include <iostream> 
#include <vector>
using namespace std;

class Solution {
public:
    int findMin(vector<int>& nums) 
    {
        int begin=0,end=nums.size()-1;
        while(begin<=end)
        {
            
int mid=(begin+end)/2; if(nums[mid]<nums[end])//後面增的,前面肯定是小的,但因為有重複元素,所以end=mid end=mid; else if(nums[mid]>nums[end]) begin=mid+1; else if(nums[mid]==nums[end])//相等的情況 end=end-1; } return nums[begin]; } };
int main() { int n,data; vector<int> nums; cin>>n; for(int i=0; i<n; i++) { cin>>data; nums.push_back(data); } int res=Solution().findMin(nums); cout<<res<<endl; return 0; }