在数组中查找峰值元素

时间:2020-02-23 14:34:12  来源:igfitidea点击:

在本教程中,我们将看到如何在数组中找到峰值元素。

问题

给定一系列整数。
在数组中找到峰值元素。 Peak Element是数组的元素是

GREATER THAN/EQUAL对于它的邻居,也就是说 iTh索引,索引处的邻居元素 i-1& i+1必须大于等于元素 i位置。
现在

数组可以有几个峰值元素,我们需要输出其中任何一个。

解决方案

这个问题的基本方法将通过整个阵列迭代,并且在每个I元元件上检查条件 arr[i-1] = arr[i+1]

  • 对于具有相同数量的数组,每个元素都将是峰值元素。
  • 对于角元素,条件略微调整,因为它们只有一个邻居,即,对于极端左元素,我们只需检查 arr[i+1] <= arr[i]
    对于极端正确的元素,我们只需检查 arr[i-1] <= arr[i]

这种方法的最严重的复杂性是 O(n)

有效的方法:

我们可以使用鸿沟和征服方法,该方法使用类似于二进制搜索的算法,其中使用中间元素检查条件,并且根据结果我们在初始阵列的一半中搜索我们的答案。
随着元素的数量在每个呼叫中获得一半,这将具有o的最严重的时间复杂性(log(n))。

算法:我们将数组的中间元素与其邻居进行比较,如果它大于或者等于其邻居。
如果中间元素大于或者等于其邻居,我们会返回它。
如果元素小于其左邻居,则确保峰值元素位于左侧。

为什么?

考虑一个数组, int[] arr = {a1, a2, a3, a4, a5, a6, a7};左邻居出现2例 (a3)比中部元素大 (a4)例如: a3 > a4:案例1:如果左邻居 (a3)是角落,那么这是我们的峰值元素。
案例-2:如果左元素不是角元素。
再次出现2个可能性,即,

  • 如果 a2 > a3然后,这成为我们上面讨论的相同递归子问题,其结果最终将递归地计算。
  • 如果 a2 < a3,然后再次 a3是我们的峰值元素,因为, a3 > a2& a3 > a4, 例如: a3大于或者等于其邻居。

当右邻居(A5)大于中部元素时,遵循相同的过程。

package org.igi.theitroad;
 
import java.util.Scanner;
 
public class PeakElement {
 
	public static void main(String[] args) {
 
		Scanner scn = new Scanner(System.in);
		int[] arr = new int[scn.nextInt()];
 
		for (int i = 0; i < arr.length; i++) {
			arr[i] = scn.nextInt();
		}
 
		int peakIndex = solve(0, arr.length - 1, arr);
		
		System.out.print("arr[]: {");
		for (int i = 0; i < arr.length; i++) {
			System.out.print(" "+arr[i]);
		}
		
		System.out.println(" }");
		System.out.println("Peak element is : " + arr[peakIndex] +
                                   " found at index " + peakIndex);
 
	}
 
	public static int solve(int start, int end, int[] arr) {
		
		//finding mid for dividing the array into two parts
		int mid = (start + end)/2;
 
		//if the mid element is not the corner element and it is greater 
                //than or equal to its neighbours
		if ((mid > 0 && mid < arr.length - 1) && (arr[mid] >= 
                     arr[mid + 1] && arr[mid] >= arr[mid - 1])) {
			return mid;
		}
 
		//if the mid element is left corner element and it is greater  
                //than or equal to its right neighbour.
 
		else if (mid == 0 && mid!= arr.length-1 && arr[mid] >= 
                         arr[mid + 1])
        {
			return mid;
		}
 
		//if the mid element is right corner element and it is greater 
                //than or equalto its left neighbour.
 
		else if (mid == arr.length - 1 && mid!= 0 && 
                         arr[mid - 1] <= arr[mid]) 
        {
			return mid;
		}
 
		//if mid element is smaller than its left neighbour, 
                //then peak element will be in left side for sure.
 
		else if (mid != 0 && arr[mid - 1] > arr[mid]) 
        {
			return solve(start, mid - 1, arr);
		} 
        else 
        {
			if(mid + 1 <= arr.length-1)
            {
			   return solve(mid + 1, end, arr);
            }
		}
		//in case the array has only one element then than is the 
                //peak element
		return 0;
	}
 
}

运行上面的程序时,我们将得到以下输出。

4 10 20 40 15
arr[]: { 10 20 40 15 }
Peak element is : 40 found at index 2