山脉数组的峰顶索引
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array
第一次题解
int item = arr[0];
for (int i = 1; i < arr.Length ; i++)
{
if (arr[i] < item)
{
return i - 1;
}
item = arr[i];
}
return 0;
就是简单地遍历寻找数组下一个值小于当前值的那个索引,就是峰顶
然后看了大佬的代码
使用二分法思路搜索,不得不说,二分法对于搜索算法的优化太好了
优化后
int n = arr.Length;
int left = 0;
int right = n - 1;
//当起始值等于终止值时说明遍历完成,此时起始值等于终止值等于峰顶索引
while (left < right)
{
int mid = left + (right - left) / 2;//取中间值
if (arr[mid]<arr[mid+1])
{
left = mid + 1;
}
else
{
right = mid;
}
}
return left;
每次循环取中间值,然后赋值在循环,根据数组长度循环次数,根据一张纸不能对折七次原理,大幅度缩小搜索次数。