GFG Minimize the Heights题Java解法为何需计算min而非直接用arr[0]
Minimize the Heights 题目的min值计算逻辑说明
首先明确题目的核心规则:数组中每个元素必须且只能执行一次操作,要么加K,要么减K,最终要让调整后数组的最大值与最小值的差尽可能小。
你参考的代码是基于排序后的最优调整策略设计的:排序后的数组,最优调整方案一定是找一个分界下标i,下标 ≤i的元素全部加K(拉高低值的整体水平),下标>i的元素全部减K(压低下值的整体水平),只有这种调整方式才能尽可能缩小整体高度差。
为什么不能直接用原数组首元素A[0]作为调整后的最小值?
因为调整后的值会出现两种最小值候选:
- 左半部分(加K的部分)的最小值是
A[0] + K(原数组排序后A[0]最小,加K后依然是左半最小) - 右半部分(减K的部分)的最小值是
A[i+1] - K(右半第一个元素是右半最小的,减K后依然是右半最小)
右半部分的最小值完全有可能比左半的最小值更小,因此必须取两者的较小值作为当前分界下的全局最小值。
举个实际例子验证:
假设排序后的数组是
[1, 3, 6],K=3
当我们取分界i=0时,A[0]加K得4,后面两个元素减K分别得0和3
此时调整后的数组为[4, 0, 3],最小值是A[1]-K=0,远小于A[0]+K=4,如果直接用A[0]加K作为最小值,计算出的高度差会完全错误。
代码中min = Math.min(A[i + 1] - K, A[0] + K)就是在计算当前分界下调整后数组的真实最小值,只有用真实最大值减去真实最小值,才能得到当前分界下的正确高度差,再和全局最小结果对比更新,就能得到最终答案。
内容的提问来源于stack exchange,提问作者Shanti Lal Prajapat
相关产品推荐
相关产品推荐

