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;
    }

你可能感兴趣的:(算法)