首页 > 试题广场 >

寻找最后的山峰

[编程题]寻找最后的山峰
  • 热度指数:4227 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。

假设 nums[-1] = nums[n] = -∞。


输入描述:

在命令行中输入一行数字,数字之间以空格分割,遇到换行符结束。输入的数字为整型,且总数量在10万以内。



输出描述:

输出索引最大的山峰的索引值(一个数字)

示例1

输入

2 4 1 2 7 8 4

输出

5

说明

索引最大的山峰的高度为8,其索引为5
import pandas as pd def max_mountain_index(a):
    b = len(a) - 1  x=[]
    y=[] for i in range(1, b):
        right_position = a[i]
        left = a[i - 1]
        right = a[i + 1] if right_position > left: if right_position > right: d = i
                e = right_position
                x.append(i)#索引  y.append(e)#值  else: continue  # print(d, e)  z=pd.Series(y,x) print(z) print("最后的山峰为:",z.max(),"对应的索引为:",z.idxmax())
a = [2,6,8,2,5,2,7,3,9,10,12,6,4,0,8,1,5,9]
A = max_mountain_index(a)
发表于 2020-08-16 21:47:54 回复(0)
import sys
n = list(map(int,sys.stdin.readline().strip().split(' ')))
peak=max(n)
for i in range(len(n)):
    if n[i]==peak:
        print i
发表于 2020-04-20 16:59:49 回复(0)
def peakIndex(arr):
    arr.insert(0,float('-inf'))
    arr.append(float('-inf'))
    res = []
    for i in range(1,len(arr)-1):
        if arr[i]>= arr[i-1] and arr[i]>=arr[i+1]:
            res.append(i-1)
    return max(res)

if __name__ == '__main__':
    arr = list(map(int,input().split()))
    print(peakIndex(arr))

发表于 2020-03-19 17:53:44 回复(7)
def mountain_peak(a):
    b =len(a) -1
    for i in range(1,b):
        right_position = a[i]
        left = a[i-1]
        right = a[i+1]
        if right_position > left:
            if right_position > right:
                d = i       
                e = right_position
            else:
                continue
    print(d,e)


a = [1, 3, 5, 17, 4, 6, 15, 3,9,7,9,6,8,5]
A = mountain_peak(a)

发表于 2020-03-11 17:20:21 回复(1)
import sys
nums = list(map(int,sys.stdin.readline().strip().split(' ')))
result = 0
i=len(nums)-1
while i>0:
    if nums[i]>=nums[i-1]:
        result = i
        break
    i-=1
print(str(result))

发表于 2020-03-09 00:20:24 回复(0)
极其简单,遍历检验即可
data = list(map(int, input().split()))
n = len(data)
max_idx = 0
for i in range(1, n - 1):
    if data[i] > data[i - 1] and data[i] > data[i + 1]:
        max_idx = i
if data[n - 1] > data[n - 2]:
    max_idx = n - 1
print(max_idx)


发表于 2020-12-23 15:25:27 回复(0)
题目虽然很简单,但要考虑的细节一旦遗漏,case就不通过了,附python3代码
nums = list(map(int, input().split()))
lon = len(nums)
# 先判断数组长度
if lon <= 1:
    max_pos = 0
else:
    # 第一个数和最后一个数只要判断一边就可以
    if nums[0] > nums[1]:
        max_pos = 0
    for i in range(1,len(nums)-1):
        if nums[i-1] < nums[i] and nums[i+1] < nums[i]:
            max_pos = i
    if nums[-1] > nums[-2]:
        max_pos = len(nums)-1
print(max_pos)



编辑于 2020-08-17 12:55:28 回复(0)
 
a = [18,12,1,2,7,14,119]
b = []
if len(a) <= 1:
    b.append(a[i])
else:
    if a[0]>a[1]:
        b.append(a[0])
    for i in range(1,len(a)-1):
        if a[i-1]<=a[i] and a[i+1]<=a[i]:
            b.append(a[i])
    if a[-1]>a[-2]:
        b.append(a[-1])
# print(b)
for j in range(len(a)):
    if a[j] == max(b):
        print(j)

发表于 2023-06-20 23:19:43 回复(0)
def mountain_peak(ls):
    result___=[]
    for i in range (len(ls)-2):
        if (ls[i+1]>ls[i]) and (ls[i+1]>ls[i+2]):
            result___.append(i+1)
    return [result___[len(result___)-1],ls[result___[len(result___)-1]]]
           
        
a = [1, 3, 5, 17, 4, 6, 15, 3,9,7,9,6,8,5]
final=mountain_peak(a)

发表于 2021-08-17 14:51:40 回复(0)
def fn(x):
    for i in range(len(x)-1,0,-1) :
        if x[i - 1] < x[i] > x[i + 1]:
            print(f'num = {x[i]},index = {i}')
            break
         
x = [1,2,,2,5,5,3,2,2,6,7,3,2,1]
fn(x)
发表于 2021-06-11 14:47:46 回复(0)
nums = [1, 2, 5, 3, 4, 2]
lon = len(nums)
index = []
# 先判断数组长度
if lon <= 1:
    index = 0
else:
    # 第一个数和最后一个数只要判断一边就可以
    if nums[0] > nums[1]:
        index = 0
    for i in range(1, len(nums)-1):
        if nums[i-1] < nums[i] and nums[i+1] < nums[i]:
            index.append(i)
    if nums[-1] > nums[-2]:
        index.append(len(nums)-1)
    # 因为多个山峰,所以取出最大值山峰的index
    for j in range(0, len(index)):
        if nums[index[j - 1]] < nums[index[j]]:
            max_index = index[j]
# print(index)
print(max_index, nums[max_index])

发表于 2021-05-23 21:12:47 回复(0)
import sys

if __name__ == "__main__":
    nums = sys.stdin.readline()
    ss = list(map(int, nums.split()))
    index = []
    for i in range(len(ss)):
        if i == 0:
            if ss[0] > ss[1]:
                index.append(0)
        if i != 0 and i != len(ss) - 1:
            if ss[i] > ss[i + 1] and ss[i] > ss[i - 1]:
                index.append(i)
        if i == len(ss) - 1:
            if ss[i] > ss[i - 1]: 
                index.append(i)
    print(index[-1])
 到底咋越界了呀?我服了

发表于 2021-03-27 23:53:10 回复(2)
def maxpeak(nums):
    index=0
    for i in range(1,len(nums)):
        if i==len(nums)-1:
            if nums[i]>=nums[i-1]:
                index=i
        else:
            if nums[i]>=nums[i-1] and nums[i]>=nums[i+1]: 
                index=i
        
    return index

strings=input()
nums=list(map(int,strings.split()))
res=maxpeak(nums)
print(res)

#已通过
发表于 2020-10-11 16:24:36 回复(0)
nums=eval(input())
result=[]
for i in range(1,len(nums)-1):
    if nums[i]>=nums[i-1] and nums[i]>nums[i+1]:
        result.append(i)
max(result)  
编辑于 2020-09-04 14:42:35 回复(0)
其实本题应该还需要讨论一个递增数组应该怎么处理,但是在程序中不用讨论也能AC
s = input().strip(' ').split(' ')
num = [int(i) for i in s]
num.append(float('-inf'))
state = True
for i in range(len(s)-1,0,-1):
    if num[i] > num[i-1] and num[i] > num[i+1]:
        print(i)
        state = False
        break
if state:
    print(0)

发表于 2020-08-21 21:40:28 回复(0)
 nums = input('请输入一组数字:')
list1 = nums.split(' ')
list2 = list(map(int,list1))
index = len(list2)-1
for j in range(index,0,-1):
    if list2[j-1] >= list2[j] and list2[j-1]>=list2[j-2]:
        print('最大峰值索引是:%d'%(j-1))
        break
发表于 2020-07-17 17:43:08 回复(0)
num = list(map(int,input().split()))
jizhi = []
for i in range(1,len(num)):
    if i != len(num)-1:
        if num[i] >= num[i-1] and num[i] >= num[i+1]:
                jizhi.append(i)
    else:
        if num[i] >= num[i-1]:
            jizhi.append(i)
a = max(jizhi)           
print(a) 

case通过率未75%,报错为可能存在非法错误,没有给出实际输出和对应参考,不清楚哪里有问题,还请各路大神指点
发表于 2020-07-04 17:26:49 回复(1)

C++

#include <vector>
#include <iostream>
using namespace std;

int solution(vector<int>&input){
    //其实元素位置和最后的元素位置单独讨论
    int len = input.size();
    if(input[len-1] >= input[len-2]) return len-1;
    int res;
    bool flag = false;
    for(int i = 1; i < input.size()-1; i++){
        if(input[i] >= input[i-1] && input[i] >= input[i+1]){
            res = i;
            flag = true;
        }
    } 
    if(flag == false) return 0;
    return res;
}

int main(void){
    int number;
    vector<int> input;
    while(cin >> number){
        input.push_back(number);
    }
    cout << solution(input) << endl;
    return 0;
}
编辑于 2020-05-23 14:43:21 回复(0)
data = readLines('stdin')
data = strsplit(data,split = " ")
data = as.numeric(unlist(data))
x = length(data)
peak = matrix(ncol = 3,nrow = x)
data = c(-Inf,data,-Inf)
peak[,1] = diff(data)[-(x+1)]
peak[,2] = diff(data)[-1]
peak[,3] = 0
peak[peak[,1]>0 & peak[,2]<0,] = 1
cat(max(which(peak[,3] == 1))-1)
R语言解法。因为有时间限制,所以一个循环都不能用,用了就超时=,=
发表于 2020-04-22 23:06:56 回复(0)
array = list(map(int, input().split()))
array.insert(0, float('-inf'))
array.append(float('-inf'))
array1 = list(reversed(array))
print(array,'\n',array1)

for i in range(1, len(array1)-1):
    if array1[i-1]<=array1[i] and array1[i+1]<=array1[i]:
        print(len(array1)-2-i)#-2是由于array1和array之间的元素个数差
        break
    else:
        continue


发表于 2020-04-14 20:37:14 回复(0)