6004. 得到 0 的操作数

给你两个 非负 整数 num1 和 num2 。

每一步 操作 中,如果 num1 >= num2 ,你必须用 num1 减 num2 ;否则,你必须用 num2 减 num1 。

例如,num1 = 5 且 num2 = 4 ,应该用 num1 减 num2 ,因此,得到 num1 = 1 和 num2 = 4 。然而,如果 num1 = 4且 num2 = 5 ,一步操作后,得到 num1 = 4 和 num2 = 1 。
返回使 num1 = 0 或 num2 = 0 的 操作数 。

func countOperations(num1 int, num2 int) int {
count := 0
for num1 != 0 && num2 != 0 {
count++
num1, num2 = minus(num1, num2)
}
return count
}

func minus(a, b int) (int, int) {
if a >= b {
return a - b, b
} else {
return a, b - a
}
}

6005. 使数组变成交替数组的最少操作数

给你一个下标从 0 开始的数组 nums ,该数组由 n 个正整数组成。

如果满足下述条件,则数组 nums 是一个 交替数组 :

nums[i - 2] == nums[i] ,其中 2 <= i <= n - 1 。
nums[i - 1] != nums[i] ,其中 1 <= i <= n - 1 。
在一步 操作 中,你可以选择下标 i 并将 nums[i] 更改 为 任一 正整数。

返回使数组变成交替数组的 最少操作数 。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105
/**
1.单双数分开找到各自里边出现数目最多的数字作为目标,即 maxA1 + maxB1;
如果两个数字一样,比较 maxA1 + maxB2 和 maxA2 + maxB1 选择较大的作为目标数
2.操作数 = 数组长度一半向下取整分别减各自数量 (长度为奇数时操作数加1) = length - maxATime - maxBTime
*/
func minimumOperations(nums []int) int {
odd := make(map[int]int)
even := make(map[int]int)
isOdd := true
for _, num := range nums {
if isOdd {
odd[num]++
} else {
even[num]++
}
isOdd = !isOdd
}
// 长度为奇数时操作数加1
maxA1 := 0
maxB1 := 0
maxA1Time := 0
maxA2Time := 0
maxB1Time := 0
maxB2Time := 0
for num, t := range odd {
if t > maxA1Time {
maxA2Time = maxA1Time
maxA1Time = t
maxA1 = num
} else if t > maxA2Time {
maxA2Time = t
}
}

for num, t := range even {
if t > maxB1Time {
maxB2Time = maxB1Time
maxB1Time = t
maxB1 = num
} else if t > maxB2Time {
maxB2Time = t
}
}
if maxA1 != maxB1 {
return len(nums) - maxA1Time - maxB1Time
} else {
if len(nums)-maxA1Time-maxB2Time > len(nums)-maxA2Time-maxB1Time {
return len(nums) - maxA2Time - maxB1Time
} else {
return len(nums) - maxA1Time - maxB2Time
}
}
}

6006. 拿出最少数目的魔法豆

给你一个 正 整数数组 beans ,其中每个整数表示一个袋子里装的魔法豆的数目。

请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩下的 非空 袋子中(即 至少 还有 一颗 魔法豆的袋子)魔法豆的数目 相等 。一旦魔法豆从袋子中取出,你不能将它放到任何其他的袋子中。

请你返回你需要拿出魔法豆的 最少数目。

提示:

  • 1 <= beans.length <= 105
  • 1 <= beans[i] <= 105
/**
取出豆子让非零的地方都相等 相等的这个数如果时其中某个数时会有最小,因为如果这个数不在数组内,那么比他小的数就都要取出来;
如果这个数相等那么就不需要取出它也能相等
*/
func minimumRemoval(beans []int) int64 {
var count int64 = 0
for _, bean := range beans {
_count := int64(0)
for _, i := range beans {
if i >= bean {
_count += int64(i - bean)
} else {
_count += int64(i)
}
}
if _count < count || count == 0 {
count = _count
}
}
return count
}
/**
beans.length = 10000 时, time > 10s, 本地能跑完但是提交超时
*/