问题:
给定一个数组,其值先从小到大递增后从大到小递减,找出最大的值。
思路:最简单的办法就是从第二个值开始,判断是否满足 A[i] > A[i-1] && A[i] > A[i+1]. 如果满足,i 就是那个最大值的下标。该算法复杂度为O(n).
我们可以改进这种算法,因为这个数组是排好序的,所以我们可以利用二分查找的思想,更快速的找到最大值,时间复杂度为O(lg n)。
public int turningPoint(int[] A) {
int m = A.length;
int begin = 0;
int end = m - 1;
int tp = begin + (end - begin)/2;
// the condition "tp > 0 && tp < m -1" makes sure that tp is not at the beginning or the end
while (tp > 0 && tp < m -1) {
if (A[tp] > A[tp + 1] && A[tp] > A[tp -1]) {
return tp;
} else if (A[tp] < A[tp+1]) {
begin = tp + 1;
tp = begin + (end - begin)/2;
} else {
end = tp - 1;
tp = begin + (end - begin)/2;
}
}
return -1;
}转载请注明出处:
http://blog.youkuaiyun.com/beiyeqingteng
本文介绍了一种针对特定形态数组(先递增后递减)寻找最大值的有效方法。通过对数组特性的巧妙利用,实现了从O(n)到O(log n)的时间复杂度优化。通过二分查找思想的应用,极大提升了查找效率。
346

被折叠的 条评论
为什么被折叠?



