LeetCode.2808. 使循环数组所有元素相等的最少秒数

题目

题目链接

分析

我们最终形成的数组一定是当前数组nums 中的一个数字。
所以我们的想法就是枚举数组 nums 中的所有数字,取最小值。

题目告诉我们每一秒都可以向左右扩散一位,那么多个相同的 x 同时扩散,扩散完整个数组耗时就取决于两个相邻最远的 x 的距离

假设这两个 x 的下标为 i 和 j,且 i < j,那么耗时就是:(j - i) / 2

枚举数组不同的,取最小值,即为答案。

因为本题中数组被看成环形状,所以在计算距离的时候 我们需要将首个元素+数组长度再次放入列表中,这样就可以处理环形了。

代码

class Solution {
    public int minimumSeconds(List<Integer> nums) {
        int n = nums.size();
        Map<Integer,List<Integer>> pos = new HashMap<>();
        for(int i = 0;i < n;i ++) {
            // 元素,List<所有下标>
            pos.computeIfAbsent(nums.get(i),k -> new ArrayList<>()).add(i);
        }

        int ans = n;
        for(List<Integer> a : pos.values()) {
            // 将首个位置的索引+n,考虑了环
            a.add(a.get(0) + n);
            int mx = 0;
            for(int i = 1;i < a.size();i ++) {
                // 统计每两个元素之间的最大距离
                mx= Math.max(mx,a.get(i) - a.get(i - 1));
            }
            ans = Math.min(ans,mx);
        }
        return ans / 2;
    }
}

在这里插入图片描述

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值