Add solution 1551

This commit is contained in:
YDZ
2021-04-07 09:27:32 +08:00
parent f376eaf316
commit ce600d6822
25 changed files with 669 additions and 484 deletions

View File

@ -0,0 +1,5 @@
package leetcode
func minOperations(n int) int {
return n * n / 4
}

View File

@ -0,0 +1,52 @@
package leetcode
import (
"fmt"
"testing"
)
type question1551 struct {
para1551
ans1551
}
// para 是参数
// one 代表第一个参数
type para1551 struct {
n int
}
// ans 是答案
// one 代表第一个答案
type ans1551 struct {
one int
}
func Test_Problem1551(t *testing.T) {
qs := []question1551{
{
para1551{3},
ans1551{2},
},
{
para1551{6},
ans1551{9},
},
{
para1551{534},
ans1551{71289},
},
}
fmt.Printf("------------------------Leetcode Problem 1551------------------------\n")
for _, q := range qs {
_, p := q.ans1551, q.para1551
fmt.Printf("【input】:%v 【output】:%v \n", p, minOperations(p.n))
}
fmt.Printf("\n\n\n")
}

View File

@ -0,0 +1,58 @@
# [1551. Minimum Operations to Make Array Equal](https://leetcode.com/problems/minimum-operations-to-make-array-equal/)
## 题目
You have an array `arr` of length `n` where `arr[i] = (2 * i) + 1` for all valid values of `i` (i.e. `0 <= i < n`).
In one operation, you can select two indices `x` and `y` where `0 <= x, y < n` and subtract `1` from `arr[x]` and add `1` to `arr[y]` (i.e. perform `arr[x] -=1` and `arr[y] += 1`). The goal is to make all the elements of the array **equal**. It is **guaranteed** that all the elements of the array can be made equal using some operations.
Given an integer `n`, the length of the array. Return *the minimum number of operations* needed to make all the elements of arr equal.
**Example 1:**
```
Input: n = 3
Output: 2
Explanation: arr = [1, 3, 5]
First operation choose x = 2 and y = 0, this leads arr to be [2, 3, 4]
In the second operation choose x = 2 and y = 0 again, thus arr = [3, 3, 3].
```
**Example 2:**
```
Input: n = 6
Output: 9
```
**Constraints:**
- `1 <= n <= 10^4`
## 题目大意
存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 0 <= i < n )。一次操作中你可以选出两个下标记作 x y 0 <= x, y < n 并使 arr[x] 减去 1 arr[y] 加上 1 arr[x] -=1 arr[y] += 1 )。最终的目标是使数组中的所有元素都 相等 题目测试用例将会 保证 在执行若干步操作后数组中的所有元素最终可以全部相等给你一个整数 n即数组的长度请你返回使数组 arr 中所有元素相等所需的 最小操作数
## 解题思路
- 这一题是数学题题目给定的操作并不会使数组中所有元素之和变化最终让所有元素相等那么数组中所有元素的平均值即为最后数组中每一个元素的值最少操作数的策略应该是以平均数为中心中心右边的数减小对称的中心左边的数增大由于原数组是等差数列两两元素之间相差 2利用数学方法可以算出操作数
- 数组长度分为奇数和偶数分别讨论如果数组长度为奇数所需要的操作数是
$$\begin{aligned} &\quad 2 + 4 + \cdots + 2\cdot\left\lfloor\frac{n}{2}\right\rfloor \\ &= \frac{1}{2}\left\lfloor\frac{n}{2}\right\rfloor\left(2\cdot\left\lfloor\frac{n}{2}\right\rfloor + 2\right) \\ &= \left\lfloor\frac{n}{2}\right\rfloor \left(\left\lfloor\frac{n}{2}\right\rfloor + 1\right) \\ &= \frac{n-1}{2}\left(\frac{n-1}{2} + 1\right) \\ &= \frac{n-1}{2}\cdot\frac{n+1}{2} \\ &= \frac{n^2-1}{4} \\ &= \left\lfloor\frac{n^2}{4}\right\rfloor \end{aligned}$$
数组长度是偶数所需要的操作数是
$$\begin{aligned} &\quad 1 + 3 + \cdots + \left(2\cdot\left\lfloor\frac{n}{2}\right\rfloor - 1\right) \\ &= \frac{1}{2}\left\lfloor\frac{n}{2}\right\rfloor\left(2\cdot\left\lfloor\frac{n}{2}\right\rfloor - 1 + 1\right)\\ &= \left(\left\lfloor\frac{n}{2}\right\rfloor\right)^2 \\ &= \frac{n^2}{4} \end{aligned}$$
综上所述最小操作数是 n^2/4
## 代码
```go
package leetcode
func minOperations(n int) int {
return n * n / 4
}
```