Maximum Number in Mountain Sequence

update Aug 17,2017 0:24

LintCodearrow-up-right

Given a mountain sequence of n integers which increase firstly and then decrease, find the mountain top.

Example

Given nums = [1, 2, 4, 8, 6, 3] return 8 Given nums = [10, 9, 8, 7], return 10

Basic Idea:

用二分法逐渐像峰顶逼近,找拐点。

Java Code:

    public class Solution {
        /**
         * @param nums a mountain sequence which increase firstly and then decrease
         * @return then mountain top
         */
        public int mountainSequence(int[] nums) {
            // Write your code here
            if (nums == null || nums.length < 1) return 0;
            if (nums.length == 1) return nums[0];
            int p = 0, r = nums.length - 1;
            while (p + 1 < r) {
                int q = (r - p) / 2 + p;
                if (nums[q + 1] - nums[q] > 0) p = q;
                if (nums[q + 1] - nums[q] < 0) r = q;
            }
            if (nums[p + 1] - nums[p] < 0) return nums[p];
            else return nums[r];
        }
    }

Python Code:

update Dec 3, 2017 15:08

Update

重写这道题的时候,起初我的判断条件分三种情况,即 当前是拐点,当前上升,当前下降 ,这样会使 code 变得冗长,看了之前写的 code 才恍然大悟,于是在这里做些补充。

事实上,在二分的过程中我们只需要跟踪第一个开始下降的点(之所以是下降起始点,是因为 q=(p+r)/2 的操作是偏左的,这样验证当前点和其右是否下降时不会越界),如果退出时 p r 都不是下降起始点,则说明 nums 是一路上升,返回 nums[-1] 即可;

java