• 【算法】—— 相邻两数的最大差值


    题目:

    思路:

    如果数组长度为N,考虑使用N+1个桶,每个桶能放入数的范围固定,将数组中数据依次放入桶中,那么肯定有一个桶是空桶(因为数一共有N个,而桶有N+1个)。

    最大差值就出现在相邻两个不为空的桶之间,具体为当前铜的最小值减去前一个桶的最大值。

    需要注意的是:如何对于每个数,计算它应该放入的桶号。

     public static int bucket(long num, long len, long min, long max) {
            return (int) ((num - min) * len / (max - min));
        }

    代码:

    import java.util.*;
    
    public class Gap {
        public int maxGap(int[] nums, int n) {
            // write code here
            if (nums == null || nums.length < 2) {
                return 0;
            }
            int len = nums.length;
            int min = Integer.MAX_VALUE;
            int max = Integer.MIN_VALUE;
            for (int i = 0; i < len; i++) {
                min = Math.min(min, nums[i]);
                max = Math.max(max, nums[i]);
            }
            if (min == max) {
                return 0;
            }
            //每个桶里是否有值
            boolean[] hasNum = new boolean[len + 1];
            //每个桶里的最大值
            int[] maxs = new int[len + 1];
            //每个桶里的最小值
            int[] mins = new int[len + 1];
            int bid = 0;
            for (int i = 0; i < len; i++) {
                bid = bucket(nums[i], len, min, max);
                mins[bid] = hasNum[bid] ? Math.min(mins[bid], nums[i]) : nums[i];
                maxs[bid] = hasNum[bid] ? Math.max(maxs[bid], nums[i]) : nums[i];
                hasNum[bid] = true;
            }
            int res = 0;
            int lastMax = maxs[0];
            int i = 1;
            for (; i <= len; i++) {
                if (hasNum[i]) {
                    res = Math.max(res, mins[i] - lastMax);
                    lastMax = maxs[i];
                }
            }
            return res;
        }
        public static int bucket(long num, long len, long min, long max) {
            return (int) ((num - min) * len / (max - min));
        }
    }
  • 相关阅读:
    CAN总线学习资料
    VMware虚拟机 硬盘空间不足 磁盘大小调整方案
    郭天祥-S3C2440开发板Linux2.6.31移植教程
    MFC串口编程——使用标准SerialCom类
    Luogu P2602 [ZJOI2010]数字计数 //数位DP
    luogu P1896 [SCOI2005] 互不侵犯 //状压DP
    中北大学ACM 5/12 T6 CSY的幸福
    P2473 || SCOI2008 奖励关 //状压&&期望DP
    请让蝴蝶爬满全身
    【图论】二分图 // 未完成 =、=
  • 原文地址:https://www.cnblogs.com/bopo/p/9298092.html
Copyright © 2020-2023  润新知