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

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

 更新時間:2021年07月31日 14:30:42   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(162.求數(shù)組的局部峰值),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(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ù)組的一個峰值,如果這里用遍歷整個數(shù)組找最大值肯定會出現(xiàn)Time Limit Exceeded,但題目中說了這個峰值可以是局部的最大值,所以我們只需要找到第一個局部峰值就可以了。所謂峰值就是比周圍兩個數(shù)字都大的數(shù)字,那么只需要跟周圍兩個數(shù)字比較就可以了。既然要跟左右的數(shù)字比較,就得考慮越界的問題,題目中給了nums[-1] = nums[n] = -∞,那么我們其實可以把這兩個整型最小值直接加入到數(shù)組中,然后從第二個數(shù)字遍歷到倒數(shù)第二個數(shù)字,這樣就不會存在越界的可能了。由于題目中說了峰值一定存在,那么有一個很重要的corner case我們要注意,就是當原數(shù)組中只有一個數(shù)字,且是整型最小值的時候,我們?nèi)绻€要首尾墊數(shù)字,就會形成一條水平線,從而沒有峰值了,所以我們對于數(shù)組中只有一個數(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;
    }
}

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

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;
    }
}

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

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

相關(guān)文章

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

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

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

    詳解設計模式中的模板方法模式及在C++中的使用

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

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

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

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

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

    C++如何計算二進制數(shù)中1的個數(shù)

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

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

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

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

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

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

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

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

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

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

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

最新評論

高阳县| 兰坪| 雷州市| 连州市| 曲周县| 宣恩县| 横峰县| 伊川县| 宕昌县| 百色市| 那坡县| 昌都县| 博野县| 晋中市| 崇文区| 九台市| 阿克| 北辰区| 沂源县| 柳州市| 揭西县| 新乡县| 繁昌县| 逊克县| 广平县| 蕉岭县| 图们市| 平度市| 措美县| 水城县| 正阳县| 信阳市| 怀柔区| 镇雄县| 崇阳县| 西丰县| 昌邑市| 都昌县| 安达市| 勐海县| 平塘县|