
我的思路
思路1
这个题目非常简单,直接排序,然后找出最大值,最大值一定是峰值,这样就结束了。
但是这样的话空间复杂度是O(n),时间复杂度是O(nlogn)+O(n),时间空间复杂度都很高
int[] arr = nums.clone();
Arrays.sort(nums);
int n= nums[nums.length-1];
for(int i=0;i<arr.length;i++){
if(arr[i]==n){
return i;
}
}
return -1;
思路2
排除特殊情况之后,一个for循环就可以解决问题
当然也可以把这个特殊情况放到循环里面进行判断,但是我感觉没必要
public int findPeakElement(int[] nums) {
int n = nums.length;
if(n==1){
return 0;
}
if(nums[0]>nums[1]){
return 0;
}
if(nums[n-1]>nums[n-2]){
return n-1;
}
for(int i =1;i<n-1;i++){
if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]){
return i;
}
}
return -1;
}
灵神思路
这个题是让设计了这个时间复杂度为 O(log n) 的算法来解决此问题。我在思路二中取巧了,思路2中是暴力破解的,只不过刚好时间上达标了而已
这个题可以采用二分查找算法,虽然这个题目并非是有序数组,但仍然可以用二分排序算法。我们要查找的不是一个具体的值,而是一个满足条件的值。
将middle处的元素与middle+1的位置元素进行相比,如果nums[middle]<nums[middle+1],那么肯定在下标 [middle+1,n−1] 中一定存在峰值。这一点比较难理解,用反正法证明这个
-
假设下标 [middle+1,n−1] 中没有峰值
-
那么nums[middle+1]就不是峰值了,则这个nums[middle+2]肯定要大于nums[middle+1],不然的话这个nums[middle+1]就是峰值了,因为nums[middle]<nums[middle+1]>nums[middle+2]
-
以此类推,如果 [middle+1,n−1] 中没有峰值,那么这个区间内的元素肯定是递增的。但是如果递增的话
- nums[n-2]<nums[n-1]>负无穷
- 则nums[n-1] 肯定是峰值。假设失败
-
public int findPeakElement(int[] nums) {
int left = -1;
int right = nums.length-1;
while(left+1<right){
int mid = left+(right-left)/2;
if(nums[mid]<nums[mid+1]){
left=mid;
}else {
right= mid;
}
}
return right;
}
206

被折叠的 条评论
为什么被折叠?



