zoukankan      html  css  js  c++  java
  • [算法]最小差值

    LeetCode 908:最小差值 I

    描述

    给定一个整数数组 A,对于每个整数 A[i],我们可以选择任意 x 满足 -K <= x <= K,并将 x 加到 A[i] 中。

    在此过程之后,我们得到一些数组 B。

    返回 B 的最大值和 B 的最小值之间可能存在的最小差值。

    示例 1:

    输入:A = [1], K = 0
    输出:0
    解释:B = [1]
    示例 2:

    输入:A = [0,10], K = 2
    输出:6
    解释:B = [2,8]
    示例 3:

    输入:A = [1,3,6], K = 3
    输出:0
    解释:B = [3,3,3] 或 B = [4,4,4]
     

    提示:

    1 <= A.length <= 10000
    0 <= A[i] <= 10000
    0 <= K <= 10000

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/smallest-range-i
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    求数组中的最小值与最大值:如果他们之间的差小于等于 2*K,那么数组中的所有数都可以通过加上一个在 [-K, K] 之间的数来达到 (min(A) + max(A)) // 2;如果他们之间的差大于 2 * K,那么处理后的数组差值最小只能达到 max(A) - min(A) - 2 * K

    代码

    import java.util.Arrays
    
    object Solution {
        def smallestRangeI(A: Array[Int], K: Int): Int = {
            Arrays.sort(A)
            val min = A(0)
            val max = A(A.length - 1)
    
            if (max - min > 2 * K) {
              max - min - 2 * K
            } else {
              0
            }
        }
    }

    LeetCode 910:最小差值 II

    描述

    给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。

    在此过程之后,我们得到一些数组 B。

    返回 B 的最大值和 B 的最小值之间可能存在的最小差值。

    示例 1:

    输入:A = [1], K = 0
    输出:0
    解释:B = [1]
    示例 2:

    输入:A = [0,10], K = 2
    输出:6
    解释:B = [2,8]
    示例 3:

    输入:A = [1,3,6], K = 3
    输出:3
    解释:B = [4,6,3]
     

    提示:

    1 <= A.length <= 10000
    0 <= A[i] <= 10000
    0 <= K <= 10000

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/smallest-range-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    为了生成数组 B,将数组升序排序后,我们需要找到数组中的一个数,小于等于这个数都加上 K,大于这个数都减去 K,设这个数是第 i 个数,那么输出的结果为 max(A[len(A)-1] - K, A[i] + K) - min(A[0] + K, A[i + 1] - K)

    时间复杂度 O(logN)

    空间复杂度 O(1)

    代码

    import java.util.Arrays
    
    object Solution {
        def smallestRangeII(A: Array[Int], K: Int): Int = {
            Arrays.sort(A)
            var min = A(0)
            var max = A(A.length - 1)
            var res = max - min
    
            //这里之所以遍历到A.length - 2,不包括A.length - 1是因为当i为A.length - 1的时候,小于等于i都加K,那么所有的都加上K了,得到的结果就跟最开始的res相同了
            for(i <- 0 until A.length - 1){
              max = Math.max(A(i) + K, A(A.length - 1) - K)
              min = Math.min(A(0) + K, A(i + 1) - K)
              res = Math.min(max - min, res)
            }
            res
        }
    }
  • 相关阅读:
    HA 高可用集群概述及其原理解析
    iOS 平台上常见的安装包有三种,deb、ipa 和 pxl
    爪洼人的第五天
    Java基础数组篇
    猛男学Java的第四天
    猛男学习JAVA的第三个日子
    猛男学习Java的第二天
    【笔记】ubuntu12.04 添加启动器图标的办法(解决启动器图标消失的问题)
    【笔记】Ubuntu12.04键盘图标(输入法图标)不见后重新显示方法
    【笔记】ubuntu下手动更新firefox浏览器
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/11291217.html
Copyright © 2011-2022 走看看