Leetcode162——寻找峰值

题目:https://leetcode-cn.com/problems/find-peak-element/description/
之前好像是阿里的电面问到了我这个问题,当时不会,真尴尬,后来面试官告诉我用二分查找可以快一些,当时还有点没想明白,后来遇到了这个题,就好好看。
第一眼感觉,有一个问题,我不知道往哪边搜,这个就是思路的问题了,大概查了下,明白了
算法思路连接:http://courses.csail.mit.edu/6.006/spring11/lectures/lec02.pdf
还有一个情况,就是我遇到的mid如果比left和right的值都要大该怎么办?这又是一个细节处理问题
这个时候就要把mid和mid+1和mid-1进行比较了
最后在写代码的时候遇到了几个坑,首先我的判断写成了
if( nums[mid] <= nums[left] && nums[mid] <= nums[right] )    
    right = mid;
if( nums[mid] <= nums[left] && nums[mid] >= nums[right] )    
    right = mid;
if( nums[mid] >= nums[left] && nums[mid] <= nums[right] )    
    left = mid;
if( nums[mid] >= nums[left] && nums[mid] >= nums[right] )
{    
    if( nums[mid] <= nums[mid - 1] )
        right = mid;    
    if( nums[mid] <= nums[mid + 1] )
        left = mid;
}
这是不对的,每次更换边界之后就要进行下一次的寻找了,这样会执行好几个if语句,好几次都遇到了这样的问题,以后这样的多种情况只可能出现一种的一定要加else
后来改完之后可以运行AC,但是最后跑了20ms,运行时间轴上都没有这个值了,时间上击败了0.0%的代码,真尴尬,想一想为什么会这么慢!感觉是我求了好多次size操作,求数组大小这个操作,如果让我来做的话,那就遍历一次,是O(n)级别的,比整个算法本身还慢,还求了好多次,这个肯定拖时间了,所以改成只求一次,果然就快了很多,最后4msAC.
class Solution
{
public:
	int findPeakElement( vector& nums )
	{
		int len = nums.size( );
		if( len <= 1 )
			return 0;

		if( nums[0] > nums[1] )
			return 0;

		if( nums[len - 1] > nums[len - 2] )
			return len - 1;

		int left = 0;
		int right = len - 1;
		int mid = ( left + right ) / 2;

		while( nums[mid] <= nums[mid - 1] || nums[mid] <= nums[mid + 1] )
		{
			if( nums[mid] <= nums[left] && nums[mid] <= nums[right] )
				right = mid;
			else if( nums[mid] <= nums[left] && nums[mid] >= nums[right] )
				right = mid;
			else if( nums[mid] >= nums[left] && nums[mid] <= nums[right] )
				left = mid;
			else if( nums[mid] >= nums[left] && nums[mid] >= nums[right] )
			{
				if( nums[mid] <= nums[mid - 1] )
					right = mid;
				else if( nums[mid] <= nums[mid + 1] )
					left = mid;
			}
			mid = ( left + right ) / 2;
		}
		return mid;
	}
};

你可能感兴趣的:(LeetCode)