[每日一题]2808. 使循环数组所有元素相等的最少秒数

思路:
1.对每一个数字:
找到相同数字间隔的最大距离,作为该数字蔓延到所有元素需要的最大距离
考虑该数字首尾之间距离、考虑该数字间隔的最大距离(中间没有间隔该数字,可间隔其他数字)
2、取所有数字中的最小距离/2作为结果,向上取整(所有可能中选择最短时间)

遇到的问题:
vector中
.front()第一个
.back()最后一个

题目描述:

给你一个下标从 0 开始长度为 n 的数组 nums 。

每一秒,你可以对数组执行以下操作:

对于范围在 [0, n - 1] 内的每一个下标 i ,将 nums[i] 替换成 nums[i] ,nums[(i - 1 + n) % n] 或者 nums[(i + 1) % n] 三者之一。
注意,所有元素会被同时替换。

请你返回将数组 nums 中所有元素变成相等元素所需要的 最少 秒数。

示例 1:

输入:nums = [1,2,1,2]
输出:1
解释:我们可以在 1 秒内将数组变成相等元素:

  • 第 1 秒,将每个位置的元素分别变为 [nums[3],nums[1],nums[3],nums[3]] 。变化后,nums = [2,2,2,2] 。
    1 秒是将数组变成相等元素所需要的最少秒数。
    示例 2:

输入:nums = [2,1,3,3,2]
输出:2
解释:我们可以在 2 秒内将数组变成相等元素:

  • 第 1 秒,将每个位置的元素分别变为 [nums[0],nums[2],nums[2],nums[2],nums[3]] 。变化后,nums = [2,3,3,3,3] 。
  • 第 2 秒,将每个位置的元素分别变为 [nums[1],nums[1],nums[2],nums[3],nums[4]] 。变化后,nums = [3,3,3,3,3] 。
    2 秒是将数组变成相等元素所需要的最少秒数。
    示例 3:

输入:nums = [5,5,5,5]
输出:0
解释:不需要执行任何操作,因为一开始数组中的元素已经全部相等。

提示:

1 <= n == nums.length <= 105
1 <= nums[i] <= 109

代码:

class Solution {
public:
    int minimumSeconds(vector<int>& nums) {
        //mi存储【数字,【出现的下标序列】】
        unordered_map<int,vector<int>> m1;
        int len=nums.size();
        for(int i=0;i<len;i++){
            m1[nums[i]].push_back(i);
        }
        int result=len;
        //对每一个数字,找到间隔的最大距离,作为该数字需要的最大距离
        //取所有数字中的最小距离
        for(auto i=m1.begin();i!=m1.end();i++){
            //两端的距离
            int temp=i->second.front()-i->second.back()+len-1;
            //间隔的最大距离是考虑最近的两个相等数之间的距离
            int temp2=0;
            for(int j=1;j<i->second.size();j++){
                temp2=max(temp2,i->second[j]-i->second[j-1]-1);
            }
            temp=max(temp,temp2);
            result=min(result,temp);
            
        }
        if(result%2==0){
            return result/2;
        }else{
            return result/2+1;
        }
        
    }
};
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值