问题:
方法:
最简单的方法,循环遍历一遍,但是算法复杂度是O(n)。题目提示复杂度是O(logN),可以很容易地联想到二分,如果中点前面的值大于中点的值,则前面的区间必存在峰值,反之后面必存在,通过二分查找可以更高效地找到峰值。
具体实现:
class FindPeakElement {
fun findPeakElement(nums: IntArray): Int {
return findPeakElement(nums, 0, nums.lastIndex)
}
private fun findPeakElement(nums: IntArray, startIndex: Int, endIndex: Int): Int {
val midIndex = (endIndex + startIndex) / 2
val midVal = nums[midIndex]
val leftIndex = midIndex - 1
val leftVal = when (midIndex) {
0 -> Long.MIN_VALUE
else -> nums[leftIndex].toLong()
}
val rightIndex = midIndex + 1
val rightVal = when (midIndex) {
nums.lastIndex -> Long.MIN_VALUE
else -> nums[rightIndex].toLong()
}
return if (midVal > leftVal && midVal > rightVal) {
midIndex
} else if (midVal < leftVal) {
findPeakElement(nums, startIndex, leftIndex)
} else {
findPeakElement(nums, rightIndex, endIndex)
}
}
}
fun main(args: Array<String>) {
val input = intArrayOf(1, 2, 4, 2)
val findPeakElement = FindPeakElement()
println(findPeakElement.findPeakElement(input))
}
有问题随时沟通
网友评论