• 算法--相邻两数最大差值



    相邻两数最大差值

     
    代码实现
     1 package com.hzf.sort;
     2 
     3 import org.junit.Test;
     4 
     5 /**
     6  * 有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。
     7  * 
     8  * 给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。
     9  * 
    10  * 测试样例: [1,2,5,4,6],5 
    11  * 返回:2
    12  * 
    13  * @author hzf
    14  *
    15  */
    16 public class Gap {
    17     public int maxGap(int[] A, int n) {
    18         /**
    19          * 第一步,找出这一组数的最大值与最小值之差
    20          * 第二步:根据差值开辟合适的桶(桶的数量为数组的长度+1,保证入桶之后,中间有空桶)
    21          * 第三步:将每个数放入到对应的桶中,中间会有空桶的情况
    22          * 第四步:只需要循环遍历桶,比较后一个桶中最小值与前一个桶中最大值之差,找出差值最大的即为所求
    23          */
    24         
    25         //第一步,找出这一组数的最大值与最小值之差
    26         int min = A[0];
    27         int max = A[0];
    28         for(int i=0; i<A.length; i++){
    29             if(A[i] < min) min = A[i];
    30             if(A[i] > max) max = A[i];
    31         }
    32         
    33         //第二步:根据差值开辟合适的桶(桶的数量为数组的长度+1,桶的数量大于数组的长度,中间有空桶)
    34         //第三步:将每个数放入到对应的桶中,中间会有空桶的情况
    35         boolean[] hasNum = new boolean[A.length+1];//判断桶中是否有数
    36         int[] maxNumBucket = new int[A.length+1];//记录当前桶的最大值
    37         int[] minNumBucket = new int[A.length+1];//记录当前桶的最小值
    38         for(int i=0; i<A.length; i++){
    39             int bucketNum = bucket(A[i], A.length, min, max);//当前数应该放入哪个桶中
    40             maxNumBucket[bucketNum] = hasNum[bucketNum] ? Math.max(maxNumBucket[bucketNum], A[i]) : A[i];
    41             minNumBucket[bucketNum] = hasNum[bucketNum] ? Math.min(minNumBucket[bucketNum], A[i]) : A[i];
    42             hasNum[bucketNum] = true;
    43         }
    44         
    45         //第四步:只需要循环遍历桶,比较后一个桶中最小值与前一个桶中最大值之差,找出差值最大的即为所求
    46         int result = 0;//最终的结果
    47         int leftBucketMax = maxNumBucket[0];//0号桶肯定有值
    48         int rightBucketMin = 0;
    49         int startBucket = 1;//从1号桶开始进行遍历
    50         
    51         for(int i=startBucket; i<A.length+1; i++){
    52             if(!hasNum[i]) continue;
    53             rightBucketMin = minNumBucket[i];
    54             if(rightBucketMin - leftBucketMax > result)
    55                 result = rightBucketMin - leftBucketMax;
    56             leftBucketMax = maxNumBucket[i];
    57         }
    58         
    59         return result;
    60     }
    61     public int bucket(long num, long arrLength, long min, long max) {//防止两个int型的数相乘,越界
    62         /**
    63          * 3,7,12,6,4
    64          * 最小值3,最大值12,每个桶的范围是(12-3)/5
    65          * 
    66          * 假设当前值为6,那么它应放入(int)((6-3)/(9/5))桶中
    67          */
    68         return (int)((num-min)/((max-min)*1.0/arrLength));      
    69     }
    70     @Test
    71     public void test(){
    72         int[] arr = new int[]{3,7,19,6,4};
    73         System.out.println(maxGap(arr,5));
    74     }
    75 }
    View Code

    测试结果

     
  • 相关阅读:
    06-按钮Button
    05-文本视图TextView
    02-运行配置AndroidManifest.xml
    01-编译配置文件build.gradle详解
    jquery获取焦点和失去焦点
    Liunx下安装Oracle11g时Oracle Grid安装包下载向导
    配置虚拟机上的RedHat6 Linux系统的网络(选择的是仅主机模式)
    Redhat镜像-RHEL-官方镜像下载大全
    在VMware中创建一个新的虚拟机 ,安装Linux4.X系统 ,之后在此基础上安装openfiler(网络存储管理实用程序)
    Oracle18C安装后首次创建数据库并用sql developer 创建连接和用户
  • 原文地址:https://www.cnblogs.com/haozhengfei/p/816f6e34b9e27d695cab660f894d05cb.html
Copyright © 2020-2023  润新知