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

leetcode[162] Find Peak Element

时间:2014-12-20 19:30:29      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

给定一个数组,假设下标0左边的为负无穷,下标size的也为负无穷。找到峰值所在。

峰值是一定存在的,因为下标0大于左边了,如果不存在那么下标1就要大于0的,一次类推下一个都要大于上一个的。那么知道size-1的时候还是大于size-2,又因为size是负无穷,那么size-1就是峰值了。所以峰值一定存在。

最挫的就是:每个词和左右的比较,符合就输出下标。边界条件判断一下。大概比较2n次。

好一些的是:因为我们知道0下标的已经大于左边了那么只要从0开始往右找,找到大于右边的值就行了,那么就是判断n次就行。

class Solution {
public:
    int findPeakElement(const vector<int> &num) {
        for (int i = 0; i < num.size() - 1; i++)
        {
            if (num[i] > num[i+1])
                return i;
        }
        return num.size() - 1;
    }
};

 

最好的就是:二分法,如果mid的左边或者右边有比它大,那么就找大的那边就行。

这是我写的:

感觉略挫

技术分享
class Solution {
public:
    int findPeakElement(const vector<int> &num) {
        int left = 0, right = num.size()-1, mid;
        if (num.size() == 1) return 0;
        
        while(left < right)
        {
            mid = (left + right)/2;
            if (mid == left && num[left] > num[right]) return left;
            else if (mid == left && num[left] < num[right]) return right;
            if (num[mid] > num[mid-1] && num[mid] > num[mid+1])
                return mid;
            else if (num[mid] < num[mid-1])
                right = mid - 1;
            else if (num[mid] < num[mid+1])
                left = mid + 1;
        }
        return left;
    }
};
View Code

这是看到的比较好的:

int findPeakElement(const vector<int> &num) {
        int left=0,right=num.size()-1;
        while(left<=right){
            if(left==right)
                return left;
            int mid=(left+right)/2;
            if(num[mid]<num[mid+1])
                left=mid+1;
            else
                right=mid;
        }
    }

 

leetcode[162] Find Peak Element

标签:

原文地址:http://www.cnblogs.com/higerzhang/p/4175716.html

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