zoukankan      html  css  js  c++  java
  • LeetCode-每日打卡-852. 山脉数组的峰顶索引

    题目地址:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/

    题目标题:山脉数组的峰顶索引  

    答题用时:2 min

    题目描述:

    符合下列属性的数组 arr 称为 山脉数组 :
    arr.length >= 3
    存在 i(0 < i < arr.length - 1)使得:
    arr[0] < arr[1] < ... arr[i-1] < arr[i]
    arr[i] > arr[i+1] > ... > arr[arr.length - 1]
    给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。

    示例 1:

    输入:arr = [0,1,0]
    输出:1
    示例 2:

    输入:arr = [0,2,1,0]
    输出:1
    示例 3:

    输入:arr = [0,10,5,2]
    输出:1
    示例 4:

    输入:arr = [3,4,5,1]
    输出:2
    示例 5:

    输入:arr = [24,69,100,99,79,78,67,36,26,19]
    输出:2
     

    提示:

    3 <= arr.length <= 104
    0 <= arr[i] <= 106
    题目数据保证 arr 是一个山脉数组
     

    进阶:很容易想到时间复杂度 O(n) 的解决方案,你可以设计一个 O(log(n)) 的解决方案吗?

    思路

      思路1:寻找山峰,即找最大值。

        时间复杂度:O(n),空间复杂度O(1)

      思路2:根据条件 arr0 < arr1 < ... arri-1 < arri > arri+1 > ... > arrn-1 

        时间复杂度:O(n),空间复杂度O(1)

      思路3:二分查找,记满足题目要求的下标 i 为 ians

        当 i < ians 时,arri < arri + 1 恒成立。

        当 i ≥ ians 时,arri > arri + 1 恒成立。

        时间复杂度:O(log n)空间复杂度:O(1)

    代码

    Demo1

    class Solution {
        public int peakIndexInMountainArray(int[] arr) {
            int maxIndex = 0;
            int maxNumber = 0;
    
            for(int i=0 ; i < arr.length; i++) {
                if(arr[i] > maxNumber) {
                    maxIndex = i;
                    maxNumber = arr[i];
                }
            }
    
            return maxIndex;
        }
    }

    Demo2 

    class Solution {
        public int peakIndexInMountainArray(int[] arr) {
            int n = arr.length;
            int ans = -1;
            for (int i = 1; i < n - 1; ++i) {
                if (arr[i] > arr[i + 1]) {
                    ans = i;
                    break;
                }
            }
            return ans;
        }
    }

    Demo3

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


    Demo2、Demo3来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    request和request.form和request.querystring的区别
    PL/SQL Developer连接64位Oracle
    C# Winform控件对透明图片重叠时导致图片不透明的解决方法
    C++11多线程编程-两个进程轮流打印1~100
    使用 C++11 并发编程入门
    STL vector动态扩容
    GDB入门教程
    统计整数中1的个数
    gulp的使用
    nvm安装教程
  • 原文地址:https://www.cnblogs.com/LinQingYang/p/14885038.html
Copyright © 2011-2022 走看看