//http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=156077&extra=page%3D2%26filter%3Dsortid%26sortid%3D311%26searchoption%5B3046%5D%5Bvalue%5D%3D2%26searchoption%5B3046%5D%5Btype%5D%3Dradio%26sortid%3D311
找打peak or drop,原来用的是递归,这次改为迭代
public static int helper1(int[] nums) {
if (nums.length == 0)
return -1;
int len = nums.length;
if (Math.abs(nums[len - 1] - nums[0]) == len - 1)
return -1;// There is no such a valley or peak
int start = 0, end = nums.length - 1;
while (start < end) {
int mid = start + (end - start) / 2;
if ((nums[mid - 1] - nums[mid]) * (nums[mid + 1] - nums[mid]) > 0)
return nums[mid];
int diffOfIndex = mid - start;
int diffOfValue = Math.abs(nums[mid] - nums[start]);
//因为如果不相差,则下标和值是对应的,则没有发生波峰或波谷
if (diffOfIndex == diffOfValue)
start = mid;
else
end = mid;
}
return -1;
}
public static void main(String[] args) {
int[] nums1 = { 1, 2, 3, 4, 3, 2 };
int[] nums2 = {};
int[] nums3 = { 1, 2, 3, 4, 5, 6, 7, 8, 7 };
int[] nums4 = { 1, 2, 3, 4, 5 };
int[] nums5 = { 5, 4, 3, 2, 1, 2, 3 };
int[] nums6 = { 9, 8, 7, 6, 7 };
System.out.println(find(nums1));
System.out.println(find(nums2));
System.out.println(find(nums3));
System.out.println(find(nums4));
System.out.println(find(nums5));
System.out.println(find(nums6));
System.out.println(helper1(nums1));
System.out.println(helper1(nums2));
System.out.println(helper1(nums3));
System.out.println(helper1(nums4));
System.out.println(helper1(nums5));
System.out.println(helper1(nums6));
}