[关闭]
@w1024020103 2017-06-24T23:47:01.000000Z 字数 1002 阅读 615

Maximum Number in Mountain Sequence

LeetCode LintCode


image_1bjdbm70pk7ul23178i107a12u19.png-70.2kB

  1. public class Solution {
  2. /**
  3. * @param nums a mountain sequence which increase firstly and then decrease
  4. * @return then mountain top
  5. */
  6. // Given nums = [1, 2, 4, 8, 6, 3] return 8
  7. // Given nums = [10, 9, 8, 7], return 10
  8. // last one which satisfy i - (i-1) > 0
  9. public int mountainSequence(int[] nums) {
  10. // Write your code here
  11. if (nums == null || nums.length == 0) {
  12. return -1;
  13. }
  14. int start = 0;
  15. int end = nums.length - 1;
  16. while ( start + 1 < end) {
  17. int mid = start + ( end - start) /2 ;
  18. if ( (nums[mid + 1] - nums[mid]) < 0 ){
  19. end = mid;
  20. } else {
  21. start = mid;
  22. }
  23. }
  24. if (nums[start] - nums[end] > 0 ) {
  25. return nums[start];
  26. } else {
  27. return nums[end];
  28. }
  29. }
  30. }

这一题用老师讲的二分法第二境界来处理会很方便。

老师举例说,该类题目是让你去找一组oooooxxxxx中的第一个x或者最后一个o。也就是给你一个数组,然后让你去找数组中第一个/最后一个满足某个条件的位置。

image_1bjdbsjml2l15et6br1fgksg8m.png-75.3kB

这里的Maximum Number in Mountain Sequence实际上是让我们找波峰。我们将问题简化为找数组中最后一个满足( a[i] - a[i - 1] > 0)的a[i],或者说最后一个导数大于零的数,或者最后一个保持递增的点; 也可以说是第一个满足(a[i+1] - a[i] < 0)的a[i].

先套用二分法模版, 决定判断标准为:

  1. while (start + 1 < end) {
  2. if ( nums[mid + 1] - nums[mid] < 0 ) {
  3. end = mid;
  4. } else {
  5. start = end;
  6. }
  7. }

循环结束后,有可能有三种情况:
- 只有一个元素
- 两个元素,递增
- 两个元素,递减

所以需要添上:

  1. if (nums[start] - nums[end] > 0 ) {
  2. return nums[start];
  3. } else {
  4. return nums[end];
  5. }
  6. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注