三次操作后最大值与最小值的最小差
难度:
标签:
题目描述
代码结果
运行时间: 55 ms, 内存: 26.8 MB
/*
* 思路:
* 1. 对数组进行排序。
* 2. 如果数组长度小于等于4,那么最多可以改变3次使所有元素相同,最大和最小值差值为0。
* 3. 如果数组长度大于4,通过改变最多3个元素,我们可以选择从数组两端开始最多移除3个元素,计算不同移除方式下的最大最小差值。
* 4. 取所有移除方式中的最小差值。
*/
import java.util.Arrays;
public class MinDifferenceStream {
public int minDifference(int[] nums) {
if (nums.length <= 4) return 0;
int[] sortedNums = Arrays.stream(nums).sorted().toArray();
int n = sortedNums.length;
return Math.min(
Math.min(sortedNums[n - 1] - sortedNums[3], sortedNums[n - 2] - sortedNums[2]),
Math.min(sortedNums[n - 3] - sortedNums[1], sortedNums[n - 4] - sortedNums[0])
);
}
}
解释
方法:
题解的核心思路是最小化数组中的最大值和最小值之间的差,通过至多改变三个元素的值。考虑到只需要关注数组中的四个最大值和四个最小值,因为数组中任何大于四个元素的改变都可以被这四个最大或最小值所覆盖。如果数组长度小于或等于4,直接返回0,因为可以将所有元素改为相同的值。如果数组很大,为了效率直接使用堆(或其他方法)来找到这四个最大和四个最小的值。然后考虑所有可能的场景:改变0个,1个,2个或3个元组中最大或最小的元素,并计算可能的最小差值。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在决定改变数组中的元素时,只考虑最大的四个和最小的四个值?改变其他位置的值会如何影响结果?
▷🦆
在处理大于32个元素的数组时,为什么选择直接使用堆来找到最大和最小的四个值,而不是始终使用排序?
▷🦆
题解中提到的`min(mx[i] - mn[3-i] for i in range(4))`的计算过程具体是如何实现最小差值的?能否详细解释这种计算方式背后的逻辑?
▷🦆
在数组长度小于或等于4的情况下,题解直接返回0,这种做法是否总是正确?存在哪些特殊情况可能导致这一假设不成立?
▷