当前位置: 首页 > article >正文

2024.1.30力扣每日一题——使循环数组所有元素相等的最少秒数

2024.1.30

      • 题目来源
      • 我的题解
        • 方法一 暴力+模拟(无法通过)
        • 方法二 哈希表+数学

题目来源

力扣每日一题;题序:2808

我的题解

方法一 暴力+模拟(无法通过)

直接暴力枚举。记录每一个元素所在的位置,然后模拟光源扩散,每次扩散左右各一个索引。

时间复杂度:O(nmlogn)。其中n表示nums的大小,m表示nums中不同元素的个数
空间复杂度:O(n)。哈希表所需要的空间

public int minimumSeconds(List<Integer> nums) {
    int n=nums.size();
    Map<Integer,List<Integer>> map=new HashMap<>();
    for(int i=0;i<n;i++){
        int num=nums.get(i);
        List<Integer> t=map.getOrDefault(num,new ArrayList<>());
        t.add(i);
        map.put(num,t);
    }
    int res=Integer.MAX_VALUE;
    for(int key:map.keySet()){
        res=Math.min(res,getTime(map.get(key),n));
    }
    return res;
}
public int getTime(List<Integer> list,int n){
    
    int res=0;
    int max_size=list.size();
    Set<Integer> cand=new HashSet<>(list);
    while(max_size!=n){
        List<Integer> t=new ArrayList<>(cand);
        for(int i:t){
            int pre=((i-1)+n)%n;
            int next=(i+1)%n;
            if(!cand.contains(pre))
                cand.add(pre);
            if(!cand.contains(next))
                cand.add(next);
        }
        res++;
        max_size=cand.size();
    }
    return res;
}

方法二 哈希表+数学

参考:官方题解

对于getTime函数中为什么这么做,没怎么看懂。以下是评论区的大佬的解答:
可以理解成仅能双向发散的光源,在有限空间中完成扩散需要的时间(速度为每秒一个索引),对于多个光源(相同数),扩散完成的时间取决于相隔最远(水桶效应)的两个光源双向奔赴的时间(最大距离除以二)。用索引相减计算出的距离实际上比相隔元素数多一,所以最终花费时间还要向下取整,如果用相隔元素数量表示距离,那时间就是向上取整。

时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(n)

public int minimumSeconds(List<Integer> nums) {
    int n=nums.size();
    Map<Integer,List<Integer>> map=new HashMap<>();
    for(int i=0;i<n;i++){
        int num=nums.get(i);
        List<Integer> t=map.getOrDefault(num,new ArrayList<>());
        t.add(i);
        map.put(num,t);
    }
    int res=Integer.MAX_VALUE;
    for(int key:map.keySet()){
        res=Math.min(res,getTime(map.get(key),n));
    }
    return res;
}
public int getTime(List<Integer> list,int n){
    int res=n;
    int mx = list.get(0) + n - list.get(list.size() - 1);
        for (int i = 1; i < list.size(); ++i) {
            mx = Math.max(mx, list.get(i) - list.get(i - 1));
        }
        res = Math.min(res, mx / 2);

    return res;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~


http://www.kler.cn/a/232733.html

相关文章:

  • 搭建深度学习开发环境
  • C# 模拟浏览器自操作(自动化办公)
  • 图像处理实验二(Image Understanding and Basic Processing)
  • 阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆
  • uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
  • 数据结构与算法-前缀和数组
  • 【MySQL进阶之路】SpringBoot 底层如何去和 MySQL 交互了呢?
  • 浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决
  • Node.js JSON Schema Ajv依赖库逐步介绍验证类型和中文错误提示
  • elementui上传文件不允许重名
  • Java中 使用Lambda表达式实现模式匹配和类型检查
  • 云服务器也能挂游戏 安卓模拟器
  • 树莓派-Ubuntu22.04
  • 【Unity游戏设计】跳一跳Day1
  • 深度学习预备知识1——数据操作
  • 设置了.gitignore文件,但某些需要被忽略的文件仍然显示
  • Git介绍和常用命令说明
  • 微软.NET6开发的C#特性——委托和事件
  • SpringMVC-组件解析
  • vscode 括号 python函数括号补全
  • 【Flink】FlinkSQL的DataGen连接器(测试利器)
  • arkTS开发鸿蒙OS应用(登录页面实现,连接数据库)
  • 158基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序
  • flink反压及解决思路和实操
  • (十八)springboot实战——spring securtity注解方式的授权流程源码解析
  • 如何连接ChatGPT?无需科学上网,使用官方GPT教程