数组找峰值(先增后减)

本文详细介绍了在递增后递减的数组中寻找峰值元素的三种方法:通过相邻元素比较、从两端向中间挤压以及利用二分查找。每种算法都提供了具体的Java实现,并分析了它们的时间复杂度和空间复杂度,均为O(logn)和O(1)。通过对数组特性的理解和巧妙的算法设计,可以高效找到峰值元素。
摘要由CSDN通过智能技术生成

题目解释分析

解释: 现在有一个数组,前边递增,后边递减。寻找最大值。
分析: 说到底,就是找一个数tar,找这个数的特点是,tar - 1 < tar >tar +1。所以,利用这个条件,就不难想到以下思路。

一:利用 tar > tar+1。

思路: for循环遍历数组,遇到tar > tar+1 时。便找到了最大值。

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

二:两端往中间挤。

 public int findPeakElement(int[] nums) {
        int i = 0;
        int j = nums.length-1;
        while(i < j){
            if(nums[i] >= nums[j]){
                j--;
            }
            else if(nums[i] < nums[j]){
                i++;
            }
        }
        return i;
    }

三:利用 tar - 1 < tar >tar +1 。

思路: 目前我们知道这组数的特点,我们只要找到一个数符合要求计科。那么时间复杂度较低的算法就是二分了!

 public int findPeakElement(int[] nums) {
        int n = nums.length;
        int left = 0, right = n - 1, ans = -1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (compare(nums, mid - 1, mid) < 0 && compare(nums, mid, mid + 1) > 0) {
                ans = mid;
                break;
            }
            if (compare(nums, mid, mid + 1) < 0) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return ans;
    }

时间复杂度:O(\log n),其中 n是数组 nums 的长度。
空间复杂度:O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值