• leetcode[162] Find Peak Element


    给定一个数组,假设下标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;
            }
        }

    2015/03/31:

    c++ 二分:logn

    class Solution {
    public:
        int findPeakElement(const vector<int> &num) {
            if (num.size() <= 1)
                return 0;
            int l = 0, r = num.size()-1;
            while(l < r){
                int mid = (l + r) / 2;
                if (num[mid] < num[mid+1]){
                    l = mid + 1;
                }
                else{
                    r = mid;
                }
            }
            return l;
        }
    };

    python:On

    class Solution:
        # @param num, a list of integer
        # @return an integer
        def findPeakElement(self, num):
            for i in range(1, len(num)):
                if num[i] < num[i-1]:
                    return i-1
            return len(num)-1
  • 相关阅读:
    河北金力集团公文流转系统
    输出《Harry Potter and the Sorcerer's Stone》英文i的字母数量并排序
    四则运算自动出题系统
    输出《Harry Potter and the Sorcerer's Stone》文本中的前N个最长用的英文单词及其数量
    《程序员的修炼之道从小工到专家》第二章阅读有感
    异常处理动手动脑
    poj 1860
    poj 2182
    poj 2253
    poj 2001
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4175716.html
Copyright © 2020-2023  润新知