美文网首页
LeetCode之Find Peak Element(Kotli

LeetCode之Find Peak Element(Kotli

作者: 糕冷羊 | 来源:发表于2019-07-08 17:41 被阅读0次

    问题:



    方法:
    最简单的方法,循环遍历一遍,但是算法复杂度是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))
    }
    

    有问题随时沟通

    具体代码实现可以参考Github

    相关文章

      网友评论

          本文标题:LeetCode之Find Peak Element(Kotli

          本文链接:https://www.haomeiwen.com/subject/nepahctx.html