zoukankan      html  css  js  c++  java
  • 局部最小值(二分)


    局部最小存在的几种情况,1. 长度为1,arr[0]就是局部最小;2. 数组的开头,如果arr[0] < arr[1] ,arr[0]被定义为局部最小。 3. 数组的结尾,如果arr[N-1] < arr[N-2] ,arr[N-1]被定义为局部最小。 所以剩下就是数组下标1~N-2之间的了。再按arr[i-1] < arr[i] <arr[i+1] 找到一个局部最小。题目最后要求返回任意一个。假如你顺序的去搜索,去找一个比左小比右小的数,那么你的时间复杂度为O(N),比如单调递减的数组,搜索到最后一个。使用二分搜索,就能达到O(logN);好像这道题,你如果直接搜索得到的答案是不对的,是不是标准答案的结构就是要你二分搜索,否则任意一个局部最小,答案也不止一个。

    class Solution {
    public:
        int getLessIndex(vector<int> arr) {
            int len = arr.size();
            //特殊情况
            if(len == 0) return -1;
            if(len == 1 || arr[0] < arr[1]) return 0;
            if(arr[len-1] < arr[len-2]) return len-1;
            //1 --- len-2 局部最小其中  arr[0] > { arr[1]    arr[len-2] } < arr[len-1]
            //二分 {arr[left]...arr[mid-1]} arr[mid]  {arr[mid+1]...arr[right]}
            int left = 1,right = len-2;
            while(left <= right){
                int mid = left + (right-left)/2;
                if(arr[mid-1] < arr[mid]) right = mid-1;
                else if(arr[mid+1] < arr[mid]) left = mid+1;
                else return mid;
            }
            //left > right 正常不会到这。
            return 0;
        }
    };
  • 相关阅读:
    多层感知机的简洁实现
    汇编语言总结(1)
    回顾下TCP/IP协议
    五笔输入法的前世今生
    大O算法
    算法基础概念
    TCP和UDP的区别
    数据结构基本概念和术语
    gdb调试方法
    GD32F20x系列使用问题总结
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/13660890.html
Copyright © 2011-2022 走看看