From f083954a99592f78724708111506c170a603f76e Mon Sep 17 00:00:00 2001 From: AC_Oier Date: Wed, 20 Oct 2021 10:27:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9C=A8feat:=20Add=20453?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "Index/\346\225\260\345\255\246.md" | 1 + ...10\347\256\200\345\215\225\357\274\211.md" | 130 ++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 "LeetCode/451-460/453. \346\234\200\345\260\217\346\223\215\344\275\234\346\254\241\346\225\260\344\275\277\346\225\260\347\273\204\345\205\203\347\264\240\347\233\270\347\255\211\357\274\210\347\256\200\345\215\225\357\274\211.md" diff --git "a/Index/\346\225\260\345\255\246.md" "b/Index/\346\225\260\345\255\246.md" index 716294c3..1e6e4979 100644 --- "a/Index/\346\225\260\345\255\246.md" +++ "b/Index/\346\225\260\345\255\246.md" @@ -20,6 +20,7 @@ | [342. 4的幂](https://leetcode-cn.com/problems/power-of-four/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/power-of-four/solution/gong-shui-san-xie-zhuan-hua-wei-2-de-mi-y21lq/) | 简单 | 🤩🤩🤩 | | [441. 排列硬币](https://leetcode-cn.com/problems/arranging-coins/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/arranging-coins/solution/gong-shui-san-xie-yi-ti-shuang-jie-shu-x-sv9o/) | 简单 | 🤩🤩🤩 | | [446. 等差数列划分 II - 子序列](https://leetcode-cn.com/problems/arithmetic-slices-ii-subsequence/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/arithmetic-slices-ii-subsequence/solution/gong-shui-san-xie-xiang-jie-ru-he-fen-xi-ykvk/) | 困难 | 🤩🤩🤩🤩🤩 | +| [453. 最小操作次数使数组元素相等](https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/solution/gong-shui-san-xie-noxiang-xin-ke-xue-xi-tt3zu/) | 中等 | 🤩🤩🤩 | | [470. 用 Rand7() 实现 Rand10()](https://leetcode-cn.com/problems/implement-rand10-using-rand7/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/implement-rand10-using-rand7/solution/gong-shui-san-xie-k-jin-zhi-zhu-wei-shen-zmd4/) | 中等 | 🤩🤩🤩🤩 | | [477. 汉明距离总和](https://leetcode-cn.com/problems/total-hamming-distance/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/total-hamming-distance/solution/gong-shui-san-xie-ying-yong-cheng-fa-yua-g21t/) | 简单 | 🤩🤩🤩 | | [483. 最小好进制](https://leetcode-cn.com/problems/smallest-good-base/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/smallest-good-base/solution/gong-shui-san-xie-xiang-jie-ru-he-fen-xi-r94g/) | 困难 | 🤩🤩🤩🤩 | diff --git "a/LeetCode/451-460/453. \346\234\200\345\260\217\346\223\215\344\275\234\346\254\241\346\225\260\344\275\277\346\225\260\347\273\204\345\205\203\347\264\240\347\233\270\347\255\211\357\274\210\347\256\200\345\215\225\357\274\211.md" "b/LeetCode/451-460/453. \346\234\200\345\260\217\346\223\215\344\275\234\346\254\241\346\225\260\344\275\277\346\225\260\347\273\204\345\205\203\347\264\240\347\233\270\347\255\211\357\274\210\347\256\200\345\215\225\357\274\211.md" new file mode 100644 index 00000000..ece5fb48 --- /dev/null +++ "b/LeetCode/451-460/453. \346\234\200\345\260\217\346\223\215\344\275\234\346\254\241\346\225\260\344\275\277\346\225\260\347\273\204\345\205\203\347\264\240\347\233\270\347\255\211\357\274\210\347\256\200\345\215\225\357\274\211.md" @@ -0,0 +1,130 @@ +### 题目描述 + +这是 LeetCode 上的 **[453. 最小操作次数使数组元素相等](https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/solution/gong-shui-san-xie-noxiang-xin-ke-xue-xi-tt3zu/)** ,难度为 **简单**。 + +Tag : 「数学」 + + + +给你一个长度为 `n` 的整数数组,每次操作将会使 `n - 1` 个元素增加 `1` 。 + +返回让数组所有元素相等的最小操作次数。 + +示例 1: +``` +输入:nums = [1,2,3] + +输出:3 + +解释: +只需要3次操作(注意每次操作会增加两个元素的值): +[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4] +``` +示例 2: +``` +输入:nums = [1,1,1] + +输出:0 +``` + + +提示: +* n == nums.length +* $1 <= nums.length <= 10^5$ +* $-10^9 <= nums[i] <= 10^9$ +* 答案保证符合 32-bit 整数 + +--- + +### 数学 + +为了方便,令原数组 $num$ 的总和为 $sum$,最小值为 $min$,最大值为 $max$,长度为 $n$,真实最小操作次数为 $ans$。 + +由于每次只能将 $n - 1$ 个元素整体加一,因此在最终的相等状态,整体元素的大小值 $t$ 满足关系 $t \geqslant max$。 + +我们考虑是否必然可以取到关系式中的等号? + +答案是不一定,当且仅当 $num$ 本身有 $n - 1$ 个元素与 $max$ 差值相等,才能取得关系式中的等号。 + +同时我们知道,$ans$ 与 $t$ 存在一一对应关系: + +$$ +ans = \frac{t * n - sum}{n - 1} +$$ + +要取得最小的 $ans$,其实等价于取得最小的 $t$,但仅靠 $t \geqslant max$ 关系,我们无法直接求得 $ans$。 + +事实上,我们可以通过值变化来进行分析,凭直觉我们会觉得:**在配平整个数组的过程中,当前数组中的最小值会参与到自增过程中。** + +我们通过「反证法」来证明该猜想的正确性。 + +假设在配平数组的过程,某次自增操作中,「当前最小值」没有参与到自增当中,那么此时自增的对象是除「当前最小值」以外的其余元素,这时候「当前最小值」与其他元素的差值将会增加 $1$,此时如果将操作换成「包含当前最小值自增」的话,我们是可以将最终值 $t$ 减一的,如果最终值 $t$ 变小的话,那么 $ans$ 也会变小,结果会更好。 + +**因此,如果我们某次自增操作中没有包含「当前最小值」对应的元素的话,我们可以通过调整 $t$ 的大小(减一),来将操作调整为「包含当前最小值进行自增」,同时结果会变好。** + +到这里就结束了吗? + +还没有,因为到这里我们还不能直接与原始最小值 $min$ 结合起来。 + +我们还需要证明 **原始的相对最小值 $min$ 在匹配过程中,可以一直保持自身是当前数组中的「相对最小值」**。 + +这可以通过「归纳法」来证明: + +**如果在每次自增操作中,都包含「当前最小值」,那么意味着原始最小值与其他元素的「相对大小」关系不会发生改变(因为原始最小值会一直作为「相对最小值」参与到每一次自增当中)得证成立。** + +至此,我们可以得到 $t$ 和 $min$ 的关系式: + +$$ +t = min + ans +$$ + +代入之前我们得到的关系式可得: + +$$ +ans = \frac{(min + ans) * n - sum}{n - 1} +$$ + +变形整理后可得: + +$$ +ans = sum - min * n +$$ + +代码: +```Java +class Solution { + public int minMoves(int[] nums) { + int n = nums.length; + int min = nums[0], sum = 0; + for (int i : nums) { + min = Math.min(min, i); + sum += i; + } + return sum - min * n; + } +} +``` +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ + + +--- + +### 补充 + +Q : 是否需要额外处理「溢出」问题? + +A : 不需要,溢出就溢出,不影响正确性。当我们推导到 $ans = sum - min * n$ 的时候,我们求的是 $sum$ 和 $min * n$ 之间的差值关系。溢出会转成负数/正数,但不会改变它们之间的差值大小。 + +--- + +### 最后 + +这是我们「刷穿 LeetCode」系列文章的第 `No.453` 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。 + +在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。 + +为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。 + +在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。 + From c18bee82078fa5e10b235ce88840cc9bc718be7e Mon Sep 17 00:00:00 2001 From: AC_Oier Date: Wed, 20 Oct 2021 11:51:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E2=9C=A8update:=20Modify=20453?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1\357\274\210\347\256\200\345\215\225\357\274\211.md" | 9 --------- 1 file changed, 9 deletions(-) diff --git "a/LeetCode/451-460/453. \346\234\200\345\260\217\346\223\215\344\275\234\346\254\241\346\225\260\344\275\277\346\225\260\347\273\204\345\205\203\347\264\240\347\233\270\347\255\211\357\274\210\347\256\200\345\215\225\357\274\211.md" "b/LeetCode/451-460/453. \346\234\200\345\260\217\346\223\215\344\275\234\346\254\241\346\225\260\344\275\277\346\225\260\347\273\204\345\205\203\347\264\240\347\233\270\347\255\211\357\274\210\347\256\200\345\215\225\357\274\211.md" index ece5fb48..2a4da993 100644 --- "a/LeetCode/451-460/453. \346\234\200\345\260\217\346\223\215\344\275\234\346\254\241\346\225\260\344\275\277\346\225\260\347\273\204\345\205\203\347\264\240\347\233\270\347\255\211\357\274\210\347\256\200\345\215\225\357\274\211.md" +++ "b/LeetCode/451-460/453. \346\234\200\345\260\217\346\223\215\344\275\234\346\254\241\346\225\260\344\275\277\346\225\260\347\273\204\345\205\203\347\264\240\347\233\270\347\255\211\357\274\210\347\256\200\345\215\225\357\274\211.md" @@ -107,15 +107,6 @@ class Solution { * 时间复杂度:$O(n)$ * 空间复杂度:$O(1)$ - ---- - -### 补充 - -Q : 是否需要额外处理「溢出」问题? - -A : 不需要,溢出就溢出,不影响正确性。当我们推导到 $ans = sum - min * n$ 的时候,我们求的是 $sum$ 和 $min * n$ 之间的差值关系。溢出会转成负数/正数,但不会改变它们之间的差值大小。 - --- ### 最后