前言
不是死知识点的考察,这种题就很有难度,慢慢推出来也很有意思。这种题有抽象二分/贪心算法脑筋急转弯型。
一、寻找峰值
二、抽象二分
public int findPeakElement(int[] nums) {
// 一定存在峰值,说明不存在连续递增的情况,这和logN有什么联系?
int low = 0,high = nums.length - 1;
while(low < high){
int mid = low + (high - low >>> 1);
int midVal = nums[mid];
// 右边必有峰值。
if(midVal < nums[high]) low = mid + 1;
// 左边必有峰值。
else if(midVal < nums[low])high = mid - 1;
// nums[low] <= midVal >= nums[high]
/* 让high--,如果high是峰值,则必有比nums[high - 1] < nums[high],
而且nums[low] <= midVal,则nums[high - 1]之前必有峰值。
*/
else --high;
}
return low;
}
总结
1)对于这种有难度/有巧劲的题,需要多理解题目的描述,挖挖里面的条件,找找和已学数据结构与算法的联系。如果不沉下心来利用已知条件分析,就会一点思路都没有,实在没有就看看题解,说明题练少了,看几个月也想不出来,浪费时间!
2)这种没有固定公式,在草稿纸上多举举例子,模拟模拟,找找规律和感觉,再运用数据结构把它表达出来,最后review慢慢沉淀一点套路。
3)最重要的还是多做做这类题目,多看看这类优秀的题解,开阔以下视野,分析起来才更加流畅,才能慢慢举一反三。
参考文献
[1] LeetCode 寻找峰值