码迷,mamicode.com
首页 > 其他好文 > 详细

162.Find Peak Element(二分查找)

时间:2015-02-12 22:53:43      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to anyone of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is apeak element and your function should return the index number 2.

click to showspoilers.

Note:

Your solution should be in logarithmic complexity.

Credits:
Special thanks to @ts for adding this problem and creating all testcases.

HideTags

 Array Binary Search

 

 

注意:

0。。。。。。。。。media1,media2。。。。。。。。n-1

二分的区间是:0。。。。。。。。。media1,media2 和media1,media2。。。。。。。。n-1

若分为0。。。。。。。。。media 和media。。。。。。。。n-1

则media为peak element的情况就被忽略了

另外,头尾添加负无穷构造新数组时要考虑溢出。

另另外:num.push_back(-2147483647-1);//不能直接push -2147483648 ,若这样,自动识别-2147483648为无符号的,不能将-号应用于无符号类型

 



#pragma once
#include<iostream>
#include<vector>
using namespace std;

//取大值
int max(int a, int b)
{
	if (a > b)
		return a;
	return b;
}

int findIt(long long *list, int begain, int end)
{	
	if (end - begain + 1 <= 6)//小到这种程度,遍历检查,作为递归出口
	{
		for (int i = begain; i <= end - 2; i++)//注意,是end-2
			if (list[i] > list[i + 1])
				continue;
			else
				if (list[i + 1] > list[i + 2])
					return i;//注意,return的不是i+1,因为list中下标都比num中大1
				else
					continue;
		return -1;//for循环结束,为找到,返回-1
	}

	int media1 = (begain + end) / 2;
	int media2 = media1 + 1;//中间两个元素的下标
	int aheadmedia = (begain + media2) / 2;//前半段中间元素的下标
	int behindmedia = (media1 + end) / 2;//后半段中间元素的下标

	if (list[aheadmedia] > list[begain] && list[aheadmedia] > list[media2])//前半段一定有
		return findIt(list, begain, media2);
	else if (list[behindmedia] > list[media1] && list[behindmedia] > list[end])//前半段没有,后半段一定有
		return findIt(list, media1, end);
	else//前后都不一定有,但一定有一个有,返回大的,因为没有的话返回-1
		return max(findIt(list, begain, media2), findIt(list, media1, end));
}


int findPeakElement(const vector<int> &num) 
{
	long long *list = new long long[num.size() + 2];
	//list[0] = num[0] - 1;//模拟头是负无穷    
	//注意,当num[0]为 - 2147483648时,上面写法list[0]会变成2147483647,因为num是int型的,会溢出。应下面这样写。
	list[0] = num[0];
	list[0]--;
	//注意!!!!!!!若list为int减1后int可能溢出,所以list应为long long类型!!!!long在32位编译器中也是4位,所以应用long long
	list[num.size() + 1] = num[num.size() - 1];
	list[num.size() + 1]--;//模拟头是负无穷
	for (int i = 0; i < (int)num.size(); i++)
		list[i + 1] = num[i];
	//至此,头尾为正无穷的新数组构造完毕

	return findIt(list, 0, num.size() + 1);
}

void main()
{
	vector<int> num;
	num.push_back(-2147483647-1);//不能直接push -2147483648 ,若这样,自动识别-2147483648为无符号的,不能将-号应用于无符号类型
	cout << "The peak element`s index in num is   " << findPeakElement(num) << endl;
	system("pause");
}


162.Find Peak Element(二分查找)

标签:

原文地址:http://blog.csdn.net/hgqqtql/article/details/43767695

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!