zoukankan      html  css  js  c++  java
  • 算法总结之 在数组中找到一个局部最小的位置

    给定无序数组arr, 已知arr中任意连个相邻的数都不相等。  写一个函数,只需返回arr中任意一个局部最小出现的位置

    本题利用二分查找

       1 如果arr为空后者长度为0,返回-1

       2 如果arr长度为1或者arr[0]<arr[1]  返回0

      3 如果arr[N-1] < arr[N-2] 返回N-1

     4 如果长度大于2 且 arr的左右两头都不是局部最小,则令 left=1, right =N-2, 然后进行二分查找

       给定思路   mid=(left+right)/2 

        如果 arr[mid] > arr[mid-1]  那么在 left......mid-1上肯定存在局部最小  所以令 right=mid-1

        如果 arr[mid] < arr[mid+1]  那么在 mid+1......right上肯定存在局部最小  所以令 left=mid+1

       上面两个都不满足,arr[mid] 就是局部最小  返回mid

        一直查找 知道left == right时停止  返回left就ok

    由此可见!!!!!! 二分查找并不是数组有序才能使用!!!!

      

          

    package TT;
    
    public class Test78 {
    
        public static int getLessIndex(int[] arr){
            if(arr==null || arr.length==0){
                return -1;
            }
            
            if(arr.length==1 || arr[0] <arr[1]){
                return 0;
            }
            if(arr[arr.length-1] < arr[arr.length-2]){
                return arr.length-1;
            }
            
            int left = 1;
            int right = arr.length-2;
            int mid = 0;
            
            while(left <right){
                
                mid = (left+right)/2;
                if(arr[mid]>arr[mid-1]){
                    right = mid-1;
                }else if(arr[mid]>arr[mid+1]){
                    left = mid+1;
                }else {
                    return mid;
                }            
                
            }
            
               return left;
            
        }
        
        public static void main(String[] args){
            
            int[] arr = new int[6];
            arr[0]=6;
            arr[1]=4;
            arr[2]=2;
            arr[3]=3;
            arr[4]=5;
            arr[5]=4;
            
            int x = getLessIndex(arr);
            System.out.println(x);
            
        }
        
    }

  • 相关阅读:
    YAML 语法小结
    小程序之脚本语言
    小程序WXML 使用小结
    微信小程序 js逻辑
    小程序开发1
    联想Y7000安装Ubuntu16.04/Win10双系统,wifi问题,显卡驱动和CUDA10安装
    VS2015中配置Eigen
    联想Y700安装显卡驱动和CUDA8.0
    php微信生成微信公众号二维码扫描进入公众号带参数
    Y7000 (1)安装ubuntu1604遇到的问题
  • 原文地址:https://www.cnblogs.com/toov5/p/7494328.html
Copyright © 2011-2022 走看看