列表

详情


BM19. 寻找峰值

描述

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] =
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?

数据范围:



如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:

示例1

输入:

[2,4,1,2,7,8,4]

输出:

1

说明:

4和8都是峰值元素,返回4的索引1或者8的索引5都可以

示例2

输入:

[1,2,3,1]

输出:

2

说明:

3 是峰值元素,返回其索引 2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 33ms, 内存消耗: 8584KB, 提交时间: 2022-06-18

static const auto io_sync_off = []() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return nullptr;
}
();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findPeakElement(vector<int>& nums) {
        int left =0, right = nums.size() - 1;
        while(right > left){
            int mid = (left + right) / 2;
            if(nums[mid] > nums[mid+1]){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }
};

C++ 解法, 执行用时: 33ms, 内存消耗: 8656KB, 提交时间: 2022-05-18

static const auto io_sync_off = []() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return nullptr;
}
();
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型
     */
    int findPeakElement(vector<int>& nums) {
        if (nums.size() == 1)
            return 0;
        // write code here
        for (int i = 1; i < nums.size() - 1; i++) {
            if (nums[i - 1] < nums[i] && nums[i] > nums[i + 1])
                return i;
        }
        if (nums[nums.size() - 1] > nums[nums.size() - 2])
            return nums.size() - 1;
        return  0;
    }
};

C++ 解法, 执行用时: 35ms, 内存消耗: 8536KB, 提交时间: 2022-06-08

static const auto io_sync_off = [](){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findPeakElement(vector<int>& nums) {
        // write code here
        int r=nums.size()-1;
        if(nums[0]>nums[1]) return 0;
        if(nums[r]>nums[r-1]) return r;
        for(int i=1;i<r;++i)
        {
            if(nums[i]>nums[i+1] && nums[i]>nums[i-1])
            {
                return i;
            }
        }
        return 0;
    }
};

C++ 解法, 执行用时: 36ms, 内存消耗: 8500KB, 提交时间: 2022-06-24

static const auto io_sync_off = [](){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findPeakElement(vector<int>& nums) {
        // write code here
        int left = 0;
        int right = nums.size() - 1;
        
        while(left < right){
            int mid = (left+right) / 2;
            
            if(nums[mid] > nums[mid+1])        right = mid;
            else    left = mid + 1;
        }
        return right;
    }
    
//     int findPeakElement(vector<int>& nums) {
//         // write code here
//         int r=nums.size()-1;
//         if(nums[0]>nums[1]) return 0;
//         if(nums[r]>nums[r-1]) return r;
//         for(int i=1;i<r;++i)
//         {
//             if(nums[i]>nums[i+1] && nums[i]>nums[i-1])
//             {
//                 return i;
//             }
//         }
//         return 0;
//     }
};

C++ 解法, 执行用时: 36ms, 内存消耗: 8540KB, 提交时间: 2022-08-02

static const auto speedup = []{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
        
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */

    int findPeakElement(vector<int>& nums) {
        // write code here
            int cur;
            vector<int> r;
            int index;
            if(nums.size()<=1)
            {
                return 0;
            }
            r.push_back(10);
            for(cur=0;cur<nums.size()-1;cur++)
            {
                    r.push_back(nums[cur+1]-nums[cur]);
            }
              r.push_back(-10);
            for(cur=0;cur<r.size()-1;cur++)
            {
  
                    if(r[cur]>0&&r[cur+1]<0)
                      {    index= cur;
                            break;}
            }
            
            return index;
    }
};

上一题