Find Peak Element

A peak element is an element that is greater than its neighbors.
Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.
The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.
You may imagine that num[-1] = num[n] = -∞.
For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

这道题可以用O(n)直接遍历一遍,但是其实有更好的方法就是binary search。这个方法看起来很简单但是实际写的时候有很多的细节需要处理。

其中的一个就是循环终止的条件,还有一个是start, end ,mid的赋值。
循环终止的条件原来想的太简单了,以为终究会有一个数字落到

        if (nums[mid] > nums[mid-1] && nums[mid] > nums[mid+1] )
        {
            /* code */
            return mid;
        }

的条件中。
但是没有想到最后只剩俩个数怎么办,只剩俩个数就会永远陷入死循环中。没有仔细思考循环的条件应该怎么设置,导致调试的时候浪费了很多的时间。刚开始调试的时候不要用太难的case做预演。用简单的case想明白。

第二个是start和end的赋值,因为mid是已经比较过的数,所以赋值的时候要把它去掉。

        if ( nums[mid] < nums[mid-1] )
        {
            /* code */
            end = mid - 1;          
        }
        if (nums[mid] > nums[mid-1]  )
        {
            /* code */
            start = mid + 1;            
        }

最后是看别个的代码发现的解决方法。有一种情况是PeakElement可能是i=0 或者i=n的情况。最开始我没想到处理的办法,但是看了这个我觉得这个办法不错。

        while(start <= end) {
            mid = start + (end - start) / 2;
            if((mid == 0 || num[mid] >= num[mid - 1]) &&
               (mid == n - 1 || num[mid] >= num[mid + 1])) {
                    return mid;
            }else if(mid > 0 && num[mid-1] > num[mid]) {
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }

原来我的代码是

        if (nums[mid] > nums[mid-1] && nums[mid] > nums[mid+1] )
        {
            /* code */
            return mid;
        }

他们的写法更简洁和完备。

你可能感兴趣的:(Find Peak Element)