山峰数组的峰顶索引c
给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。
返回峰值元素的下标。
你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。
示例 1:
输入:arr = [0,1,0]
输出:1
示例 2:
输入:arr = [0,2,1,0]
输出:1
示例 3:
输入:arr = [0,10,5,2]
输出:1
提示:
3 <= arr.length <= 105
0 <= arr[i] <= 106
题目数据 保证 arr 是一个山脉数组(峰值前是递增,峰值后递减)
int peakIndexInMountainArray(int* arr, int arrSize) { //暴力法 int left=1,right=arrSize-2,ans=0;//left=1和right-2目的是减少循环次数; for(;left<=right;left++) { if(arr[left]>arr[left+1]) { ans=left; break;}//第一个左大于右的是峰值,及时断开循环 } return ans; }
int peakIndexInMountainArray(int* arr, int arrSize) { //二分法 int n = arrSize; int left = 1, right = n - 2, ans = 0;//减少循环次数 while (left <= right) {//巧妙之处在于循环条件,要不断更新left和right int mid = (left + right) / 2; if (arr[mid] > arr[mid + 1]) {//同样的可以让arr[mid]与左值比较,但//left和right要做出相应改变。 ans = mid;//接收现在中间值的下标, right = mid - 1; } else { left = mid + 1; } } return ans; }
吐槽一下,空调对着吹真的给我吹懵了,半天才缓回来。
补充下二分法的知识:
作用条件:①用于查找的内容逻辑上来说是需要有序的
②查找的数量只能是一个,而不是多个
需要注意查找的区域是不断迭代的,所以确定查找的范围十分重要。
二分法的思想,因为整个数组是有序的,一般递增或递减当然还有本题山脉数组。
首先选择数组中间的数字和需要查找的目标值比较
如果相等最好,就可以直接返回答案了
如果不相等
如果中间的数字大于目标值,则中间数字向右的所有数字都大于目标值,全部排除
如果中间的数字小于目标值,则中间数字向左的所有数字都小于目标值,全部排除
同时查找的区域变化。
二分法就是按照这种方式进行快速排除查找
注意数组的长度为奇为偶是不重要的,按照数组定义(一般最后一位是\0)所以一般要将数组长度减一,二分法的思想就是从原本长度的一般进行查找,不断地一半直至找到。
后面可能补充。

浙公网安备 33010602011771号