首页 > 试题广场 >

寻找峰值

[编程题]寻找峰值
  • 热度指数:161113 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] =
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?

数据范围:



如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:
示例1

输入

[2,4,1,2,7,8,4]

输出

1

说明

4和8都是峰值元素,返回4的索引1或者8的索引5都可以     
示例2

输入

[1,2,3,1]

输出

2

说明

3 是峰值元素,返回其索引 2     
int findPeakElement(int* nums, int numsLen ) {
    int i=numsLen/2;
    if(numsLen==1)
        return 0;
    if(numsLen==2)
        return nums[0]>nums[1]?0:1;
        
    while(i>0 && i<numsLen-1) {
        if(nums[i]<nums[i+1]) 
            i++;
        else if(nums[i]<nums[i-1]) 
            i--;
        else 
            return i;
        if(i<=0 || i>=(numsLen-1))
            return i;
    }
    return i;
}

编辑于 2024-03-16 09:17:49 回复(0)
int findPeakElement(int* nums, int numsLen ) {
    int max=-1000000;
    for(int i = 0;i<numsLen;i++)
    {
        if(max<nums[i])
        {
            max=nums[i];
        }
    }
    for(int i = 0;i<numsLen;i++)
    {
        if(max==nums[i])
        {
            return i;
        }
    }
    return -1;
}

发表于 2024-02-23 13:14:00 回复(1)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 */
int findPeakElement(int* nums, int numsLen ) {
    // write code here
    if (nums[0]>nums[1]) {
        return 0;
    }

    if (nums[numsLen -1] > nums[numsLen - 2]) {
        return numsLen -1;
    }

    int high = 1;

    for (int i = 0; i< numsLen-2 ;i+=2,high += 2) {
        if (nums[i]<nums[high] && nums[high+1]<nums[high] ) {
            return high;
        }
    }
    return -1;
}

编辑于 2023-12-06 15:50:53 回复(0)
//暴力循环
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 */
#include <stdio.h>
int findPeakElement(int* nums, int numsLen ) {
    // write code here
    int a = 0,b = 0;
    int i = 1,k=0;
    //i++;
    if (numsLen<=1) {
        return 0;
    }
    else if (numsLen <= 2) {
        if (*nums<*(nums+1)) {
            return 1;
        } 
        else {
            return 0;
        }
    }
    for(;i<numsLen-1; i++)
    {
        a = nums[i]-nums[i-1];
        b = nums[i]-nums[i+1];
        if((a>0)&&(b>0)) return i;
    }
    for(k = 0; k<numsLen; k++) printf("%d", nums[k]);
    printf("ret %d",i);
    if (nums[numsLen-1]>nums[numsLen-2]) return i;
    else if (nums[0]>nums[1])
        return 0;
    return i;
}

发表于 2023-11-29 21:10:55 回复(0)
int findPeakElement(int* nums, int numsLen) 
{
    if (numsLen <= 1) 
    {
        return 0; // 数组长度为0或1,假定第一个元素为峰值
    }
    
    int i;
    for (i = 0; i < numsLen; i++) 
    {
        if ((i == 0 || nums[i-1] < nums[i]) && (i == numsLen-1 || nums[i] > nums[i+1])) 
        {
            return i; // 找到峰值元素
        }
    }
    
    return -1; // 没有找到峰值元素
}

发表于 2023-08-19 18:31:14 回复(0)
int findPeakElement(int* nums, int numsLen ) {
  int left=(0+numsLen-1)/2;
  int right=left;
  int mid1=left;
  int mid2=right;
  if(nums[0]>nums[1])
  {
    return 0;
  }
  if(nums[numsLen-1]>nums[numsLen-2])
  {
    return numsLen-1;
  }
  while(left>=0||right<=numsLen-1)
  {
       if(nums[left]>nums[left-1]&&nums[left+1]<nums[left])
       {
           return left;
       }
       else if(nums[left-1]>nums[left])
       {
          mid1=left-1;
       }
       else
       {
         mid1=left-2;
       }
       left=mid1;
       if(nums[right]>nums[right-1]&&nums[right+1]<nums[right])
       {
           return right;
       }
       else if(nums[right]<nums[right+1])
       {
          mid2=right+1;
       }
       else
       {
         mid2=right+2;
       }
       right=mid2;
  }
  return -1;
}
发表于 2023-06-09 09:42:38 回复(0)
int findPeakElement(int* nums, int numsLen ) {
    int i=0,flag=1,num=0;
    if(numsLen<3)
    {
        for(i=0;i<numsLen;i++)
        if(*(nums+i)>*(nums+i+1))
        return i;
        else
        return i+1;
    }
   
    for(i=0;i<numsLen-1;i++)
    {
        if(*(nums+i)>*(nums+i+1))
        {
            flag=0;
            num=i;
            break;
        }
    }
    if(flag==1)
        return numsLen-1;
    else
    return num;
}
发表于 2023-04-02 23:20:42 回复(0)

C语言实现

int findPeakElement(int* nums, int numsLen )
{
    int ret=0;
    if(numsLen>2)
    {
        for(int i=1;i<numsLen;i++)
        {
            if(nums[i]>nums[i-1]&&nums[i]>nums[i+1])
            {
                ret = i;
                break;
            }
        }
    }
    else if(nums==0||numsLen==0)
    {
        ret = 0;
    }
    else
    {
        if(nums[1]>nums[0])
        ret=1;
    }
    return ret;
}
发表于 2023-02-01 12:56:47 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 */
#include <stdbool.h>
int findPeakElement(int* nums, int numsLen ) {
    // write code here

    int iNum = 0;

    if (numsLen == 1) {
        return  0;
    }

    bool bflag = false;

    for (int i = 1; i < numsLen; i++) {
        if (nums[i] > nums[i - 1]) {
            iNum = i;
            bflag = true;
        }else {
            if (bflag) {
                break;
            }
        }
    }

    return  iNum;
}

发表于 2023-01-17 14:08:34 回复(0)
int findPeakElement(int* nums, int numsLen ) {
    // write code here
  if(numsLen==1){
    return 0;
  }
  if(numsLen==2){
      if(nums[0]>nums[1]){
          return 0;
      }
      else return 1;
      
  }
   for(int i=1;i<numsLen;i++){
    if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]){
        return i;
    }

   }
  if(nums[0]>nums[numsLen-1]){
      return 0;
  }
  else return numsLen-1;

}

发表于 2022-12-16 09:42:23 回复(0)
int findPeakElement(int* nums, int numsLen ) {
    if(nums == NULL || numsLen < 1 || numsLen > 2*pow(10,5))
        return -1;

    int index = 0, num = 0;
    
    while(numsLen-1 > 0)
    {
        if(nums[num] < nums[num+1])
            index = num+1;

        if(nums[index] > nums[index+1])
            return index;
        
        num++, numsLen--;
    }
    return index;
}

发表于 2022-11-15 17:28:30 回复(0)
二分就可以了,根据题目只要进入循环则必有峰值,所以循环条件可以随便写
int findPeakElement(intnumsint numsLen ) {
    // write code here
    if(nums[0]>nums[1]) return 0;
    if(nums[numsLen-1]>nums[numsLen-2]) return numsLen-1;
    int left,middle, right;
    left=0;
    right=numsLen; 
    while(1)
    {
        middle=left+((right - left)>>1);
        if(nums[middle]<nums[middle-1]) right=middle-1;
        else if(nums[middle]<nums[middle+1]) left=middle+1;
        else return middle;
    }
}

发表于 2022-10-31 12:47:11 回复(0)
int findPeakElement(int* nums, int numsLen ) {
    int index;
    int max;
    if(numsLen == 1) index=0;
    index = 0;            //作为峰值的索引
    max = nums[index];     //将数组第一个值作为峰值
    for(int i=1 ; i<numsLen ;i++){ 
       if(nums[i]>max){
           index = i;
           if(nums[i+1] != NULL && nums[i] >nums[i+1]){
               index=i;
           } else max = nums[i];
       }   
    }
    return index;
}
发表于 2022-05-17 09:38:38 回复(0)
int findPeakElement(int* nums, int numsLen ) {
    int i = 0;
    while(nums[i]<nums[i+1]){
        ++i;
        if(i == numsLen-1) return numsLen-1;
    }
    return i;
    // write code here
}

发表于 2022-03-20 08:49:35 回复(1)

问题信息

上传者:牛客301499号
难度:
22条回答 5598浏览

热门推荐

通过挑战的用户

查看代码