欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二)

 更新時(shí)間:2021年07月29日 16:16:12   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 154. Find Minimum in Rotated Sorted Array II 尋找旋轉(zhuǎn)有序數(shù)組的最小值之二

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.

The array may contain duplicates.

Example 1:

Input: [1,3,5]
Output: 1

Example 2:

Input: [2,2,2,0,1]
Output: 0

Note:

這道尋找旋轉(zhuǎn)有序重復(fù)數(shù)組的最小值是之前那道 Find Minimum in Rotated Sorted Array 的拓展,當(dāng)數(shù)組中存在大量的重復(fù)數(shù)字時(shí),就會(huì)破壞二分查找法的機(jī)制,將無(wú)法取得 O(lgn) 的時(shí)間復(fù)雜度,又將會(huì)回到簡(jiǎn)單粗暴的 O(n),比如這兩種情況:{2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2} 和 {2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2},可以發(fā)現(xiàn),當(dāng)?shù)谝粋€(gè)數(shù)字和最后一個(gè)數(shù)字,還有中間那個(gè)數(shù)字全部相等的時(shí)候,二分查找法就崩潰了,因?yàn)樗鼰o(wú)法判斷到底該去左半邊還是右半邊。這種情況下,將右指針左移一位(或者將左指針右移一位),略過(guò)一個(gè)相同數(shù)字,這對(duì)結(jié)果不會(huì)產(chǎn)生影響,因?yàn)橹皇侨サ袅艘粋€(gè)相同的,然后對(duì)剩余的部分繼續(xù)用二分查找法,在最壞的情況下,比如數(shù)組所有元素都相同,時(shí)間復(fù)雜度會(huì)升到 O(n),參見(jiàn)代碼如下:

解法一:

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

跟之前那道 Find Minimum in Rotated Sorted Array 一樣,還是可以用分治法 Divide and Conquer 來(lái)解,不過(guò)寫(xiě)法跟之前那道略有不同,只有在 nums[start] < nums[end] 的時(shí)候,才能返回 nums[start],等于的時(shí)候不能返回,比如 [3, 1, 3] 這個(gè)數(shù)組,或者當(dāng) start 等于 end 成立的時(shí)候,也可以直接返回 nums[start],后面的操作跟之前那道題相同,每次將區(qū)間 [start, end] 從中間 mid 位置分為兩段,分別調(diào)用遞歸函數(shù),并比較返回值,每次取返回值較小的那個(gè)即可,參見(jiàn)代碼如下:

解法二:

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

Github 同步地址:

https://github.com/grandyang/leetcode/issues/154

類似題目:

Find Minimum in Rotated Sorted Array

參考資料:

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/discuss/48808/My-pretty-simple-code-to-solve-it

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/discuss/167981/Beats-100-Binary-Search-with-Explanations

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(154.尋找旋轉(zhuǎn)有序數(shù)組的最小值之二)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)尋找旋轉(zhuǎn)有序數(shù)組的最小值之二內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于C語(yǔ)言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)

    基于C語(yǔ)言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)

    大家好,本篇文章主要講的是基于C語(yǔ)言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語(yǔ)言實(shí)現(xiàn)棧及棧的詳解

    C語(yǔ)言實(shí)現(xiàn)棧及棧的詳解

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)棧及棧的詳解,一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作,進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧頂,另一端稱為棧底,需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言深入探究冒泡排序與堆排序使用案例講解

    C語(yǔ)言深入探究冒泡排序與堆排序使用案例講解

    算法中排序是十分重要的,而每一個(gè)學(xué)習(xí)計(jì)算機(jī)的都會(huì)在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言冒泡排序與堆排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • C++中的STL中map用法詳解(零基礎(chǔ)入門(mén))

    C++中的STL中map用法詳解(零基礎(chǔ)入門(mén))

    map在編程中是經(jīng)常使用的一個(gè)容器,本文來(lái)講解一下STL中的map,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單三子棋游戲

    C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單三子棋游戲,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++之WSAAsyncSelect模型實(shí)例

    C++之WSAAsyncSelect模型實(shí)例

    這篇文章主要介紹了C++的WSAAsyncSelect模型,實(shí)例講述了socket與Windows消息機(jī)制的用法,需要的朋友可以參考下
    2014-10-10
  • 解析bitmap處理海量數(shù)據(jù)及其實(shí)現(xiàn)方法分析

    解析bitmap處理海量數(shù)據(jù)及其實(shí)現(xiàn)方法分析

    本篇文章是對(duì)bitmap處理海量數(shù)據(jù)及其實(shí)現(xiàn)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺談C++不同繼承之間的關(guān)系

    淺談C++不同繼承之間的關(guān)系

    本文主要介紹了淺談C++不同繼承之間的關(guān)系,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 詳解C++中的一維數(shù)組和二維數(shù)組

    詳解C++中的一維數(shù)組和二維數(shù)組

    這篇文章主要介紹了詳解C++中的一維數(shù)組和二維數(shù)組,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C語(yǔ)言文件操作詳情(一)

    C語(yǔ)言文件操作詳情(一)

    這篇文章主要介紹了C語(yǔ)言文件操作詳情,主要討論的是數(shù)據(jù)文件,通過(guò)處理的磁盤(pán)上的文件展開(kāi)主題內(nèi)容介紹,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-04-04

最新評(píng)論