leetcode/1675.Minimize-Deviation-in-Array/README.md
You are given an array nums of n positive integers.
You can perform two types of operations on any element of the array any number of times:
2.
[1,2,3,4], then you can do this operation on the last element, and the array will be [1,2,3,2].2.
[1,2,3,4], then you can do this operation on the first element, and the array will be [2,2,3,4].The deviation of the array is the maximum difference between any two elements in the array.
Return the minimum deviation the array can have after performing some number of operations.
Example 1:
Input: nums = [1,2,3,4]
Output: 1
Explanation: You can transform the array to [1,2,3,2], then to [2,2,3,2], then the deviation will be 3 - 2 = 1.
Example 2:
Input: nums = [4,1,5,20,3]
Output: 3
Explanation: You can transform the array after two operations to [4,2,5,5,3], then the deviation will be 5 - 2 = 3.
Example 3:
Input: nums = [2,10,8]
Output: 3
Constraints:
n == nums.length2 <= n <= 1051 <= nums[i] <= 10^9给你一个由 n 个正整数组成的数组 nums 。你可以对数组的任意元素执行任意次数的两类操作:
返回数组在执行某些操作之后可以拥有的 最小偏移量 。
min <= nums[i]/2 这个条件。每次循环都更新该次循环的最大值和最小值,并记录偏移量。不断的循环,直到最大值为奇数,退出循环。最终输出最小偏移量。package leetcode
func minimumDeviation(nums []int) int {
min, max := 0, 0
for i := range nums {
if nums[i]%2 == 1 {
nums[i] *= 2
}
if i == 0 {
min = nums[i]
max = nums[i]
} else if nums[i] < min {
min = nums[i]
} else if max < nums[i] {
max = nums[i]
}
}
res := max - min
for max%2 == 0 {
tmax, tmin := 0, 0
for i := range nums {
if nums[i] == max || (nums[i]%2 == 0 && min <= nums[i]/2) {
nums[i] /= 2
}
if i == 0 {
tmin = nums[i]
tmax = nums[i]
} else if nums[i] < tmin {
tmin = nums[i]
} else if tmax < nums[i] {
tmax = nums[i]
}
}
if tmax-tmin < res {
res = tmax - tmin
}
min, max = tmin, tmax
}
return res
}