描述
给定一个长度为n的列表nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 (1)峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于; (2)列表两个边界可以看成是最小,nums[0]=nums[-1]= −∞ (3)对于所有有效的 i 都有 nums[i] != nums[i + 1]。
样例
输入
2 4 1 2 7 8 4
输出
5
代码:
nums = []
s = input().split(' ')
for x in s:
nums.append(float(x))
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] > nums[mid + 1]:
right = mid
else:
left = mid + 1
print(left)
代码解析:
nums = []
:定义一个空列表,用于存储输入的数字列表。s = input().split(' ')
:通过input()函数获取用户输入的一行字符串,并使用split(' ')方法将其拆分成一个字符串列表。默认情况下,split()方法使用空格作为分隔符来拆分字符串。for x in s:
:对字符串列表s进行迭代,将迭代的值依次赋给变量x。nums.append(float(x))
:将字符串x转换为浮点数类型,并将其添加到nums列表中。left, right = 0, len(nums) - 1
:同时为变量left和right赋初值。left表示当前搜索范围的左边界,初始为0;right表示当前搜索范围的右边界,初始为列表的最后一个索引。while left < right:
:当left小于right时,执行循环体内的代码。这表示搜索范围还没有缩小到只有一个元素。mid = (left + right) // 2
:计算当前搜索范围的中间位置的索引。使用整数除法(//)确保mid是整数。if nums[mid] > nums[mid + 1]:
:比较mid位置上的元素值与其右边相邻元素的值。如果mid位置上的元素值大于右边相邻元素的值,说明峰值在mid的左边,将搜索范围缩小到[left, mid]。right = mid
:将搜索范围的右边界更新为mid位置,因为nums[mid]已经不可能是峰值,可以排除掉。else:
:如果mid位置上的元素值小于或等于右边相邻元素的值,说明峰值在mid的右边,将搜索范围缩小到[mid+1, right]。left = mid + 1
:将搜索范围的左边界更新为mid + 1,因为mid位置上的元素值已经被排除。print(left)
:打印最终得到的峰值的索引,即left的值。利用了二分查找的思想来寻找峰值。通过不断缩小搜索范围,每次将搜索范围减半,直到找到峰值所在的位置。