最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(162.求數(shù)組的局部峰值)

 更新時(shí)間:2021年07月31日 14:30:42   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(162.求數(shù)組的局部峰值),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 162.Find Peak Element 求數(shù)組的局部峰值

A peak element is an element that is greater than its neighbors.

Given an input array nums, where nums[i] ≠ nums[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that nums[-1] = nums[n] = -∞.

Example 1:

Input: nums = [1,2,3,1]
Output: 2
Explanation: 3 is a peak element and your function should return the index number 2.

Example 2:

Input: nums = [1,2,1,3,5,6,4]
Output: 1 or 5
Explanation: Your function can return either index number 1 where the peak element is 2,
or index number 5 where the peak element is 6.

Note:

Your solution should be in logarithmic complexity.

這道題是求數(shù)組的一個(gè)峰值,如果這里用遍歷整個(gè)數(shù)組找最大值肯定會(huì)出現(xiàn)Time Limit Exceeded,但題目中說了這個(gè)峰值可以是局部的最大值,所以我們只需要找到第一個(gè)局部峰值就可以了。所謂峰值就是比周圍兩個(gè)數(shù)字都大的數(shù)字,那么只需要跟周圍兩個(gè)數(shù)字比較就可以了。既然要跟左右的數(shù)字比較,就得考慮越界的問題,題目中給了nums[-1] = nums[n] = -∞,那么我們其實(shí)可以把這兩個(gè)整型最小值直接加入到數(shù)組中,然后從第二個(gè)數(shù)字遍歷到倒數(shù)第二個(gè)數(shù)字,這樣就不會(huì)存在越界的可能了。由于題目中說了峰值一定存在,那么有一個(gè)很重要的corner case我們要注意,就是當(dāng)原數(shù)組中只有一個(gè)數(shù)字,且是整型最小值的時(shí)候,我們?nèi)绻€要首尾墊數(shù)字,就會(huì)形成一條水平線,從而沒有峰值了,所以我們對(duì)于數(shù)組中只有一個(gè)數(shù)字的情況在開頭直接判斷一下即可,參見代碼如下:

C++ 解法一:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        nums.insert(nums.begin(), INT_MIN);
        nums.push_back(INT_MIN);
        for (int i = 1; i < (int)nums.size() - 1; ++i) {
            if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) return i - 1;
        }
        return -1;
    }
};

Java 解法一:

class Solution {
    public int findPeakElement(int[] nums) {
        if (nums.length == 1) return 0;
        int[] newNums = new int[nums.length + 2];
        System.arraycopy(nums, 0, newNums, 1, nums.length);
        newNums[0] = Integer.MIN_VALUE;
        newNums[newNums.length - 1] = Integer.MIN_VALUE;
        for (int i = 1; i < newNums.length - 1; ++i) {
            if (newNums[i] > newNums[i - 1] && newNums[i] > newNums[i + 1]) return i - 1;
        }
        return -1;
    }
}

我們可以對(duì)上面的線性掃描的方法進(jìn)行一些優(yōu)化,可以省去首尾墊值的步驟。由于題目中說明了局部峰值一定存在,那么實(shí)際上可以從第二個(gè)數(shù)字開始往后遍歷,如果第二個(gè)數(shù)字比第一個(gè)數(shù)字小,說明此時(shí)第一個(gè)數(shù)字就是一個(gè)局部峰值;否則就往后繼續(xù)遍歷,現(xiàn)在是個(gè)遞增趨勢(shì),如果此時(shí)某個(gè)數(shù)字小于前面那個(gè)數(shù)字,說明前面數(shù)字就是一個(gè)局部峰值,返回位置即可。如果循環(huán)結(jié)束了,說明原數(shù)組是個(gè)遞增數(shù)組,返回最后一個(gè)位置即可,參見代碼如下:

C++ 解法二:

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

Java 解法二:

public class Solution {
    public int findPeakElement(int[] nums) {
        for (int i = 1; i < nums.length; ++i) {
            if (nums[i] < nums[i - 1]) return i - 1;
        }
        return nums.length - 1;
    }
}

由于題目中提示了要用對(duì)數(shù)級(jí)的時(shí)間復(fù)雜度,那么我們就要考慮使用類似于二分查找法來縮短時(shí)間,由于只是需要找到任意一個(gè)峰值,那么我們?cè)诖_定二分查找折半后中間那個(gè)元素后,和緊跟的那個(gè)元素比較下大小,如果大于,則說明峰值在前面,如果小于則在后面。這樣就可以找到一個(gè)峰值了,代碼如下:

C++ 解法三:

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

Java 解法三:

public class Solution {
    public int findPeakElement(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < nums[mid + 1]) left = mid + 1;
            else right = mid;
        }
        return right;
    }
}

類似題目:

Peak Index in a Mountain Array

參考資料:

https://leetcode.com/problems/find-peak-element

https://leetcode.com/problems/find-peak-element/discuss/50232/find-the-maximum-by-binary-search-recursion-and-iteration

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(162.求數(shù)組的局部峰值)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)求數(shù)組的局部峰值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT中進(jìn)程的創(chuàng)建實(shí)現(xiàn)

    QT中進(jìn)程的創(chuàng)建實(shí)現(xiàn)

    本文主要介紹了QT中進(jìn)程的創(chuàng)建實(shí)現(xiàn),詳細(xì)介紹了創(chuàng)建進(jìn)程的整個(gè)過程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-08-08
  • 詳解設(shè)計(jì)模式中的模板方法模式及在C++中的使用

    詳解設(shè)計(jì)模式中的模板方法模式及在C++中的使用

    這篇文章主要介紹了設(shè)計(jì)模式中的模板方法模式及在C++中的使用,模板方法將邏輯封裝到一個(gè)類中,并采取組合(委托)的方式解決這個(gè)問題,需要的朋友可以參考下
    2016-03-03
  • C語言實(shí)現(xiàn)隨機(jī)抽取紙牌程序

    C語言實(shí)現(xiàn)隨機(jī)抽取紙牌程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)隨機(jī)抽取紙牌程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言深入了解函數(shù)

    C語言深入了解函數(shù)

    C語言函數(shù)是用來模塊化構(gòu)建程序的。如果你的功能少,你可以全都寫在mian函數(shù)中,但是當(dāng)實(shí)現(xiàn)功能多的時(shí)候,如果全寫在main的函數(shù)里,不僅代碼不美觀,而且函數(shù)實(shí)現(xiàn)的時(shí)候結(jié)構(gòu)復(fù)雜,代碼重復(fù)
    2022-05-05
  • C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)

    C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)

    這篇文章主要介紹了C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 深入了解一下C語言中的柔性數(shù)組

    深入了解一下C語言中的柔性數(shù)組

    柔性數(shù)組是在C99中定義的,即結(jié)構(gòu)體的最后一個(gè)元素允許是未知大小的數(shù)組,這就叫柔性數(shù)組。這篇文章將通過簡單的示例為大家介紹一下柔性數(shù)組的使用,感興趣的可以了解一下
    2023-02-02
  • C語言詳盡圖解函數(shù)棧幀的創(chuàng)建和銷毀實(shí)現(xiàn)

    C語言詳盡圖解函數(shù)棧幀的創(chuàng)建和銷毀實(shí)現(xiàn)

    我們知道c語言中函數(shù)都是被調(diào)用的,main函數(shù)里面能調(diào)用其他函數(shù),其實(shí)main函數(shù)也是被別的函數(shù)調(diào)用的,下面通過本文給大家分享c語言函數(shù)棧幀的創(chuàng)建和銷毀過程,一起看看吧
    2022-05-05
  • C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法

    C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法

    這篇文章主要介紹了C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法,涉及C語言針對(duì)數(shù)組的遍歷與判斷技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • do...while(0)的妙用詳細(xì)解析

    do...while(0)的妙用詳細(xì)解析

    do...while(0)消除goto語句;通常,如果在一個(gè)函數(shù)中開始要分配一些資源,然后在中途執(zhí)行過程中如果遇到錯(cuò)誤則退出函數(shù),當(dāng)然,退出前先釋放資源
    2013-09-09
  • 詳解C語言中printf輸出的相關(guān)函數(shù)

    詳解C語言中printf輸出的相關(guān)函數(shù)

    這篇文章主要介紹了C語言中printf輸出的相關(guān)函數(shù)總結(jié),是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08

最新評(píng)論

郓城县| 北京市| 巴彦县| 青河县| 涞源县| 武清区| 同心县| 隆尧县| 景宁| 淳化县| 湘阴县| 兰西县| 新和县| 卫辉市| 嵩明县| 建昌县| 松滋市| 历史| 海淀区| 新余市| 青海省| 西畴县| 渑池县| 开江县| 津市市| 鹿泉市| 梧州市| 清流县| 兰考县| 房山区| 扬州市| 清流县| 海丰县| 政和县| 大埔区| 南汇区| 德化县| 偏关县| 福州市| 贵州省| 永吉县|