在数组中查找峰值元素
时间:2020-02-23 14:34:12 来源:igfitidea点击:
在本教程中,我们将看到如何在数组中找到峰值元素。
问题
给定一系列整数。
在数组中找到峰值元素。 Peak Element
是数组的元素是
GREATER THAN/EQUAL
对于它的邻居,也就是说 i
Th索引,索引处的邻居元素 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