我的代码如下。我使用二进制搜索来解决问题。 38/58测试用例可以通过,但这不能通过任何方式: [3,4,3,2,1],我在纸上计算了,过程如下: 端= 4,中等= 0 +(4-0)/ 2 = 2,开始= 2。 但在上面的例子中,start应为1。
我不知道如何修改我的代码。
class Solution {
public int findPeakElement(int[] nums) {
if (nums.length == 0 ||nums.length == 1) {
return 0;
}
int start = 0;
int end = nums.length - 1;
int mid;
//binary search
while (start + 1 < end) {
mid = start + (end - start) / 2;
if (nums[start] < nums[start + 1]) {
start = mid;
}
else {
end = mid;
}
}
System.out.println ("start=" + start);
System.out.println ("end=" + end);
System.out.println ("nums[start]=" + nums[start]);
System.out.println ("nums[end]=" + nums[end]);
if (nums[start] < nums[end]) {
return end;
}
else {
return start;
}
}
}
答案 0 :(得分:0)
你应该改变
nums[start] < nums[start + 1]
到
nums[mid] < nums[mid + 1]
但是,您的算法只有在阵列出现时才会起作用。正在急剧增加和减少。
和
mid = start + (end - start) / 2;
与
完全相同mid = (start + end) / 2;
所以我觉得它更好更简单
答案 1 :(得分:0)
您的解决方案有点复杂,这是一个更简洁的解决方案。如果你逐行去,你会发现它需要的支票比你想象的要少。
mid非常棘手,但如果start
和end
设置正确,则无需添加起始值。
class Solution {
public int findPeakElement(int[] nums) {
if (nums.length <= 1){
return 0;
}
int start = 0;
int end = nums.length - 1;
int mid = 0;
//binary search
while (start < end) {
mid = (start + end) / 2;
if (nums[mid] > nums[mid + 1]) {
end = mid;
}
else if (nums[mid] < nums[mid + 1]) {
start = mid+1;
}
}
return start;
}
}