• 【无标题】剑指offer——寻找峰值


    描述

    给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

    1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于

    2.假设 nums[-1] = nums[n] = -\infty−∞

    3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

    4.你可以使用O(logN)的时间复杂度实现此问题吗?

    数据范围:

    1 \le nums.length \le 2\times 10^5 \1≤nums.length≤2×105 

    -2^{31}<= nums[i] <= 2^{31} - 1−231<=nums[i]<=231−

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

    输入:[2,4,1,2,7,8,4]

    返回值:1

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

    示例2

    输入:[1,2,3,1]
    返回值:2

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

    思路一:因为nums[-1]和nums[n]都为负无穷,所有获取一个最大值肯定是波峰,但是时间复杂度是O(n)。

    1. public class Solution {
    2. /**
    3. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    4. *
    5. *
    6. * @param nums int整型一维数组
    7. * @return int整型
    8. */
    9. public int findPeakElement (int[] nums) {
    10. // write code here
    11. int temp = 0;
    12. for(int i =1;i<nums.length;i++){
    13. if(nums[i] > nums[temp]){
    14. temp = i;
    15. }
    16. }
    17. return temp;
    18. }
    19. }

    思路二:上坡一定有波峰,下坡不一定有波峰,时间复杂度O(logn)

    1. public class Solution {
    2. /**
    3. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    4. *
    5. *
    6. * @param nums int整型一维数组
    7. * @return int整型
    8. */
    9. public int findPeakElement (int[] nums) {
    10. // write code here
    11. int left = 0;
    12. int right = nums.length - 1;
    13. while(left < right){
    14. int mid = (left + right)/2;
    15. if(nums[mid] < nums[mid + 1]){
    16. left = mid + 1;
    17. }else{
    18. right = mid;
    19. }
    20. }
    21. return left;
    22. }
    23. }
  • 相关阅读:
    【Java】ArrayList集合使用
    操作系统迁移难?Alibaba Cloud Linux 支持跨版本升级 | 龙蜥技术
    【MATLAB】史上最全的11种数字信号滤波去噪算法全家桶
    【CSS】伪元素与伪类
    Go语言 Map教程
    泰迪智能科技-2024年高校大数据人才培养探索模式
    Jmeter提取协议报文、请求头、请求体、响应体
    vue 部分知识点总结
    十三、系统优化
    企事业单位/公司电脑文件透明加密保护 | 防泄密软件\系统!
  • 原文地址:https://blog.csdn.net/chenkaibsw/article/details/125458725