【思维题】B022_LC_三次操作后最大值与最小值的最小差牌(空出3个位置)

一、Problem

给你一个数组 nums ,每次操作你可以选择 nums 中的任意一个数字并将它改成任意值。

请你返回三次操作后, nums 中最大值与最小值的差的最小值。

输入:nums = [1,5,0,10,14]
输出:1
解释:将数组 [1,5,0,10,14] 变成 [1,1,0,1,1] 。
最大值与最小值的差为 1-0 = 1 。

提示:

1 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9

二、Solution

方法一:滑窗

突破点在于如何选数进行修改:将最小的数改成较大的数、将最大的数改成较小的数(目标是尽量让数值接近于平衡)

具体改成什么数我们不能立马知道,但可以通过一个大小为 n-3 的窗口(窗口外部始终空出 3 个位置),并实时记录窗口内部的最大、最小值之差的最小值(这个值就是答案),来枚举将左右端点互改的最小差值
【思维题】B022_LC_三次操作后最大值与最小值的最小差牌(空出3个位置)_第1张图片

class Solution {
     
    public int minDifference(int[] A) {
     
        int n = A.length, l = 0, r = n-4, ans = Integer.MAX_VALUE;
        if (n < 4) return 0;
        Arrays.sort(A);
        
        while (r < n) {
     
            ans = Math.min(ans, A[r++]-A[l++]);
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度: O ( 1 ) O(1) O(1)

你可能感兴趣的:(排序)