Skip to content

Commit 0229238

Browse files
committed
feat: add solutions to lc problem: No.0453
No.0453.Minimum Moves to Equal Array Elements
1 parent c3d5b33 commit 0229238

File tree

5 files changed

+89
-50
lines changed

5 files changed

+89
-50
lines changed

solution/0400-0499/0453.Minimum Moves to Equal Array Elements/README.md

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,32 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45-
定义 s 表示数组元素之和,mi 表示数组中最小的元素,n 表示数组的长度,经过最小的 k 次操作过后,每个元素都变成 v。
45+
**方法一:数学**
4646

47-
那么:
47+
我们不妨记数组 $nums$ 的最小值为 $mi$,数组的和为 $s$,数组的长度为 $n$。
4848

49-
```
50-
k * (n - 1) + s = v * n ①
51-
```
49+
假设最小操作次数为 $k$,最终数组的所有元素都为 $x$,则有:
5250

53-
实际上,v 与 mi 存在着这样的关系:
51+
$$
52+
\begin{aligned}
53+
s + (n - 1) \times k &= n \times x \\
54+
x &= mi + k \\
55+
\end{aligned}
56+
$$
5457

55-
```
56-
v = mi + k ②
57-
```
58+
将第二个式子代入第一个式子,得到:
5859

59-
这是因为,最小的数每次都会被增加,直至变成 v。因此,如果最终数字是 v,那么操作的次数 `k = v - mi`
60+
$$
61+
\begin{aligned}
62+
s + (n - 1) \times k &= n \times (mi + k) \\
63+
s + (n - 1) \times k &= n \times mi + n \times k \\
64+
k &= s - n \times mi \\
65+
\end{aligned}
66+
$$
6067

61-
整合 ①②,可得
68+
因此,最小操作次数为 $s - n \times mi$。
6269

63-
```
64-
k = s - mi * n
65-
```
70+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
6671

6772
<!-- tabs:start -->
6873

@@ -92,10 +97,10 @@ class Solution {
9297
class Solution {
9398
public int minMoves(int[] nums) {
9499
int s = 0;
95-
int mi = Integer.MAX_VALUE;
96-
for (int num : nums) {
97-
s += num;
98-
mi = Math.min(mi, num);
100+
int mi = 1 << 30;
101+
for (int x : nums) {
102+
s += x;
103+
mi = Math.min(mi, x);
99104
}
100105
return s - mi * nums.length;
101106
}
@@ -109,10 +114,10 @@ class Solution {
109114
public:
110115
int minMoves(vector<int>& nums) {
111116
int s = 0;
112-
int mi = INT_MAX;
113-
for (int num : nums) {
114-
s += num;
115-
mi = min(mi, num);
117+
int mi = 1 << 30;
118+
for (int x : nums) {
119+
s += x;
120+
mi = min(mi, x);
116121
}
117122
return s - mi * nums.size();
118123
}
@@ -123,16 +128,29 @@ public:
123128
124129
```go
125130
func minMoves(nums []int) int {
126-
mi := math.MaxInt32
131+
mi := 1 << 30
127132
s := 0
128-
for _, num := range nums {
129-
s += num
130-
if num < mi {
131-
mi = num
133+
for _, x := range nums {
134+
s += x
135+
if x < mi {
136+
mi = x
132137
}
133138
}
134139
return s - mi*len(nums)
140+
}
141+
```
135142

143+
### **TypeScript**
144+
145+
```ts
146+
function minMoves(nums: number[]): number {
147+
let mi = 1 << 30;
148+
let s = 0;
149+
for (const x of nums) {
150+
s += x;
151+
mi = Math.min(mi, x);
152+
}
153+
return s - mi * nums.length;
136154
}
137155
```
138156

solution/0400-0499/0453.Minimum Moves to Equal Array Elements/README_EN.md

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ class Solution {
6161
class Solution {
6262
public int minMoves(int[] nums) {
6363
int s = 0;
64-
int mi = Integer.MAX_VALUE;
65-
for (int num : nums) {
66-
s += num;
67-
mi = Math.min(mi, num);
64+
int mi = 1 << 30;
65+
for (int x : nums) {
66+
s += x;
67+
mi = Math.min(mi, x);
6868
}
6969
return s - mi * nums.length;
7070
}
@@ -78,10 +78,10 @@ class Solution {
7878
public:
7979
int minMoves(vector<int>& nums) {
8080
int s = 0;
81-
int mi = INT_MAX;
82-
for (int num : nums) {
83-
s += num;
84-
mi = min(mi, num);
81+
int mi = 1 << 30;
82+
for (int x : nums) {
83+
s += x;
84+
mi = min(mi, x);
8585
}
8686
return s - mi * nums.size();
8787
}
@@ -92,16 +92,29 @@ public:
9292
9393
```go
9494
func minMoves(nums []int) int {
95-
mi := math.MaxInt32
95+
mi := 1 << 30
9696
s := 0
97-
for _, num := range nums {
98-
s += num
99-
if num < mi {
100-
mi = num
97+
for _, x := range nums {
98+
s += x
99+
if x < mi {
100+
mi = x
101101
}
102102
}
103103
return s - mi*len(nums)
104+
}
105+
```
104106

107+
### **TypeScript**
108+
109+
```ts
110+
function minMoves(nums: number[]): number {
111+
let mi = 1 << 30;
112+
let s = 0;
113+
for (const x of nums) {
114+
s += x;
115+
mi = Math.min(mi, x);
116+
}
117+
return s - mi * nums.length;
105118
}
106119
```
107120

solution/0400-0499/0453.Minimum Moves to Equal Array Elements/Solution.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ class Solution {
22
public:
33
int minMoves(vector<int>& nums) {
44
int s = 0;
5-
int mi = INT_MAX;
6-
for (int num : nums) {
7-
s += num;
8-
mi = min(mi, num);
5+
int mi = 1 << 30;
6+
for (int x : nums) {
7+
s += x;
8+
mi = min(mi, x);
99
}
1010
return s - mi * nums.size();
1111
}
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
func minMoves(nums []int) int {
2-
mi := math.MaxInt32
2+
mi := 1 << 30
33
s := 0
4-
for _, num := range nums {
5-
s += num
6-
if num < mi {
7-
mi = num
4+
for _, x := range nums {
5+
s += x
6+
if x < mi {
7+
mi = x
88
}
99
}
1010
return s - mi*len(nums)
11-
1211
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
function minMoves(nums: number[]): number {
2+
let mi = 1 << 30;
3+
let s = 0;
4+
for (const x of nums) {
5+
s += x;
6+
mi = Math.min(mi, x);
7+
}
8+
return s - mi * nums.length;
9+
}

0 commit comments

Comments
 (0)