leetcode-162-寻找峰值(find peak element)-java

版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/84966188

题目及测试

package pid162;
/*寻找峰值

峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞。

示例 1:

输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5 
解释: 你的函数可以返回索引 1,其峰值元素为 2;
     或者返回索引 5, 其峰值元素为 6。

说明:

你的解法应该是 O(logN) 时间复杂度的。

*/


public class main {
	
	public static void main(String[] args) {
		int[][] testTable = {{1,2,3,1},{1,2,1,3,5,6,4},{1,2},{3,2,1,5,6,4}};
		for (int[] ito : testTable) {
			test(ito);
		}
	}
		 
	private static void test(int[] ito) {
		Solution solution = new Solution();
		int rtn;
		long begin = System.currentTimeMillis();
		for (int i = 0; i < ito.length; i++) {
		    System.out.print(ito[i]+" ");		    
		}
		System.out.println();
		//开始时打印数组
		
		rtn = solution.findPeakElement(ito);//执行程序
		long end = System.currentTimeMillis();	
		
		//System.out.println(ito + ": rtn=" + rtn);
		System.out.println(": rtn=" +rtn);
		
		
		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

解法1(成功,3ms,极快)

直接顺序查找,看now>prev&&now>next即可

package pid162;

import java.util.Arrays;

import javax.naming.InitialContext;

public class Solution {
public int findPeakElement(int[] nums) {
    int length=nums.length;
    if(length==1){
    	return 0;
    }
    int prev=nums[0];
    int now=nums[1];   
    int next;    
    int index=0;
    for(int i=1;i<length-1;i++){
    	next=nums[i+1];
    	if(now>prev&&now>next){
    		index=i;    		
    		break;
    	}
    	prev=now;
    	now=next;
    }
    if(nums[0]>nums[1]){
    	index=0;
    }
    if(nums[length-1]>nums[length-2]){
    	index=length-1;
    }
	
	
	return index;
    }
}

解法2(别人的)

数组中必有一个峰,因为最左端和最右端元素只要比旁边的大,也可以当峰

题目中已经说明,最左端和最右端元素均无限小,中间元素比两侧都要大,那么本题中一定存在一个峰元素。所以不管中间有多少波峰,只要找到峰元素,我们只需找到刚刚开始下降而未下降的位置。采用二分查找,查出这样一个位置即可,我们知道二分查找要比较的是 target 元素,本题的 target 元素是 mid 的后一个元素,即 nums[mid] 与 nums[mid+1] 进行比较:
 

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

猜你喜欢

转载自blog.csdn.net/xushiyu1996818/article/details/84966188
今日推荐