c语言中数组中的峰值元素

c语言中数组中的峰值元素,c,arrays,C,Arrays,我得到了一个整数数组。我必须在其中找到一个峰值元素。 如果数组元素不小于其相邻元素,则该数组元素为峰值。 对于角元素,只考虑一个邻居。 例如: 对于输入数组{10,20,15,2,23,90,67} 有两个峰值元素:20和90。我需要返回任何一个峰值元素 我尝试的解决方案是对阵列进行线性扫描,我发现了一个峰值元素。该方法最坏情况下的时间复杂度为O(n) 我们能在最坏的时间复杂度下找到比O(n)更好的峰值元素吗?是的,你可以使用类似于二进制搜索的思想在O(logn)中找到它。指向向量的中间并检查其

我得到了一个整数数组。我必须在其中找到一个峰值元素。 如果数组元素不小于其相邻元素,则该数组元素为峰值。 对于角元素,只考虑一个邻居。 例如:

对于输入数组
{10,20,15,2,23,90,67}
有两个峰值元素:20和90。我需要返回任何一个峰值元素

我尝试的解决方案是对阵列进行线性扫描,我发现了一个峰值元素。该方法最坏情况下的时间复杂度为O(n)


我们能在最坏的时间复杂度下找到比O(n)更好的峰值元素吗?

是的,你可以使用类似于二进制搜索的思想在O(logn)中找到它。指向向量的中间并检查其相邻部分。如果它大于相邻元素的,则返回元素,它是一个峰值。如果right元素较大,则在数组的右侧递归查找峰值。如果left元素更大,则在数组的左侧递归查找峰值。

是的,可以在更高的时间复杂度中查找峰值。使用分治法

下面的链接将帮助您。

根据其他人的回答(在我下面)一些代码(带有O(logn)):

//查找峰值元素的分而治之解决方案
#包括
//一种基于二进制搜索的函数,返回峰值元素的索引
int findPeakUtil(int arr[],int低,int高,int n)
{
//中间元素鳍指数
int mid=低+(高-低)/2;/*(低+高)/2*/
//将中间元素与其相邻元素进行比较(如果存在相邻元素)
如果((mid==0 | | arr[mid-1]arr[mid])
返回findPeakUtil(arr,低,(中-1),n);
//若中间元素不是峰值,且其右邻域大于峰值
//那么右半部分必须有一个峰值元素
否则返回findPeakUtil(arr,(mid+1),high,n);
}
//递归函数findPeakUtil()上的包装器
int findPeak(int arr[],int n)
{
返回findPeakUtil(arr,0,n-1,n);
}
/*用于检查上述功能的驱动程序*/
int main()
{
int arr[]={1,3,20,4,1,0};
int n=sizeof(arr)/sizeof(arr[0]);
printf(“峰值指数为%d”,findPeak(arr,n));
返回0;
}
在麻省理工学院6.006开放式课程中使用此选项也可以查看


IMHO,你必须检查这个数组的所有元素,所以O(n)是最小值。@Navnath:这个搜索不需要排序数据。不,它是O(logn)。假设你的右元素大于当前元素。然后你可以确定右边的序列包含一个峰值。因此,你将要查看的元素数减半,结果是O(logn)。分治算法的一个很好的例子。@Navnath在这个问题中我们不需要,因为给定了一个元素和给定的(例如)它的右邻域,如果邻域大于中心点,我们可以保证右边有一个峰值:如果所有元素继续增加,一个峰值就是数组的右极端;如果下一个元素小于邻域,则邻域就是峰值。对于任何其他情况,都会递归。@JonathanLeffler Supp如果你看右边,那么右边的元素1比当前的元素大。现在我们只需要选择:右边的元素是一个峰值,或者它旁边的元素更大。重复这个过程,直到你找到一个峰值或者到达序列的末尾,根据定义,这就是一个峰值。因此,你肯定会看到d一到右边就会出现一个峰值。否:最坏的情况是O(对数N)。请阅读中的PDF,了解原因,如何仅搜索大的峰值(不是每个峰值,例如,大于相邻的100个峰值)?此代码不应该有UPVOLUES。它没有找到peak。此代码没有找到peak,但找到了peak的索引。然后,您可以使用该索引来获取peak元素。另请参考live示例。
// A divide and conquer solution to find a peak element element
#include <stdio.h>

// A binary search based function that returns index of a peak element
int findPeakUtil(int arr[], int low, int high, int n)
{
    // Fin index of middle element
    int mid = low + (high - low)/2;  /* (low + high)/2 */

    // Compare middle element with its neighbours (if neighbours exist)
    if ((mid == 0 || arr[mid-1] <= arr[mid]) &&
            (mid == n-1 || arr[mid+1] <= arr[mid]))
        return mid;

    // If middle element is not peak and its left neighbor is greater than it
    // then left half must have a peak element
    else if (mid > 0 && arr[mid-1] > arr[mid])
        return findPeakUtil(arr, low, (mid -1), n);

    // If middle element is not peak and its right neighbor is greater than it
    // then right half must have a peak element
    else return findPeakUtil(arr, (mid + 1), high, n);
}

// A wrapper over recursive function findPeakUtil()
int findPeak(int arr[], int n)
{
    return findPeakUtil(arr, 0, n-1, n);
}

/* Driver program to check above functions */
int main()
{
    int arr[] = {1, 3, 20, 4, 1, 0};
    int n = sizeof(arr)/sizeof(arr[0]);
    printf("Index of a peak point is %d", findPeak(arr, n));
    return 0;
}