题目解释分析
解释: 现在有一个数组,前边递增,后边递减。寻找最大值。
分析: 说到底,就是找一个数tar,找这个数的特点是,tar - 1 < tar >tar +1。所以,利用这个条件,就不难想到以下思路。
一:利用 tar > tar+1。
思路: for循环遍历数组,遇到tar > tar+1 时。便找到了最大值。
public int findPeakElement(int[] nums) {
for(int i = 0; i<nums.length-1; i++){
if(nums[i] > nums[i+1]){
return i;
}
}
return nums.length-1;
}
二:两端往中间挤。
public int findPeakElement(int[] nums) {
int i = 0;
int j = nums.length-1;
while(i < j){
if(nums[i] >= nums[j]){
j--;
}
else if(nums[i] < nums[j]){
i++;
}
}
return i;
}
三:利用 tar - 1 < tar >tar +1 。
思路: 目前我们知道这组数的特点,我们只要找到一个数符合要求计科。那么时间复杂度较低的算法就是二分了!
public int findPeakElement(int[] nums) {
int n = nums.length;
int left = 0, right = n - 1, ans = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (compare(nums, mid - 1, mid) < 0 && compare(nums, mid, mid + 1) > 0) {
ans = mid;
break;
}
if (compare(nums, mid, mid + 1) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return ans;
}
时间复杂度:O(\log n),其中 n是数组 nums 的长度。
空间复杂度:O(1)。