文章目录
- LeetCode?启动!!!
- 题目:使循环数组所有元素相等的最少秒数
- 题目描述
- 代码与解题思路
LeetCode?启动!!!
今天的题目类型差不多是第一次见到,原来题目描述的操作是每个数 “扩散” 到整个数组,直到数组的数变的一模一样
题目:使循环数组所有元素相等的最少秒数
题目链接:2808. 使循环数组所有元素相等的最少秒数
题目描述
代码与解题思路
func minimumSeconds(nums []int) int {
pos := map[int][]int{}
for i, v := range nums {
pos[v] = append(pos[v], i) // 下标数组 pos[v]
}
n := len(nums)
ans := n/2 // 每一秒钟, 两个值相同的数都在同时往外扩散, 如果只有一个数能扩散, 就需要 n/2 秒
for _, a := range pos {
max_len := a[0] + n - a[len(a)-1] // 环形数组 nums 两个下标背面相隔的距离
for i := 1; i < len(a); i++ {
max_len = max(max_len, a[i]-a[i-1]) // 数组 nums 两个下标正面相隔的距离
}
ans = min(ans, max_len/2) // 两个数同时扩散, 所以需要/2
}
return ans
}
这道题我用的思路是:
- 先将数组中值相同的数塞进以该值为 key 的 map 中
- 遍历 map 中每一个数组,找出两个下标之间最远的长度(因为题目给出的:nums[(i - 1 + n) % n] 代表着 nums 数组能够被看成是一个环形数组,所以我们需要计算两种情况:一个是正常的下标相减,一个是环形数组从背面的下标相减,也就是这个操作:max_len := a[0] + n - a[len(a)-1])
- 最后找到所有相同数下标能够扩散到对方的最小值,就是我们要求的最小秒数了(如果没有两个以上的相同数,那就只能用一个数扩散 n/2 秒了)