Leetcode---寻找峰值--遍历和二分

寻找峰值

题目链接:寻找峰值

思路:
  • 这道题的题目有点没讲明白,比如一个数组为{1,5,2,3,4}那么这里5是峰值,4属于峰值吗?
  • 第一个解法就是直接遍历,遍历1——nums.length-2之间的数是否为峰值,没有峰值则返回max{nums[0],nums[nums.length-1]},相当于利用峰值的定义
	public int findPeakElement(int[] nums) {
		int max_index = 0;
		if(nums.length==1) {
			return max_index;
		}else if(nums.length==2){
			return nums[0]>nums[1]?0:1;
		}
		int i=1;
        for(;i<nums.length-1;i++) {
        	if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]) {
        		return i;
        	}
        }
		return nums[0]>nums[nums.length-1]?0:nums.length-1;
  • 这里我提交答案发现,该题中类似于上面数组的时候,4也属于峰值,这时我们就可以利用二分法求解
  • 求得数组的mid下标,将该数与mid+1上的数比较,舍弃较小的一边,直至找到最大值,返回其下标
  • 这里不适用递归,定义左右两个指针,使用循环即可
	public int findPeakElement(int[] nums) {
        if(nums.length==1) {
			return 0;
		}
		int left = 0,right = nums.length-1;
		while(left<right) {
			int mid = left+(right-left)/2;
			if(nums[mid]>nums[mid+1]) {
				right = mid;
			}else {
				left = mid+1;
			}
		}
		return left;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值