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

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.lryc.cn/news/296634.html

相关文章:

  • 【Java万花筒】数据魔术师:探索Java商业智能与数据可视化
  • python用yaml装参数并支持命令行修改
  • 第59讲订单数据下拉实现
  • [当人工智能遇上安全] 11.威胁情报实体识别 (2)基于BiGRU-CRF的中文实体识别万字详解
  • 16:定时器和计数器
  • c#通过ExpressionTree 表达式树实现对象关系映射
  • 《动手学深度学习(PyTorch版)》笔记7.2
  • 【MySQL进阶之路】BufferPool 生产环境优化经验
  • Vim工具使用全攻略:从入门到精通
  • Chapter 8 - 7. Congestion Management in TCP Storage Networks
  • 带你快速入门js高级-基础
  • 数据结构与算法-链表(力扣附链接)
  • 多线程JUC:等待唤醒机制(生产者消费者模式)
  • 无人机动力系统高倍率锂聚合物电池介绍,无人机锂电池使用与保养,无人机飞行控制动力源详解
  • [BeginCTF]真龙之力
  • 手写分布式存储系统v0.3版本
  • 除夕快乐!
  • 17:定时器编程实战
  • Fink CDC数据同步(五)Kafka数据同步Hive
  • ubuntu原始套接字多线程负载均衡
  • leetcode (算法)66.加一(python版)
  • DataX源码分析 TaskGroupContainer
  • 2024年华为OD机试真题-螺旋数字矩阵-Java-OD统一考试(C卷)
  • 红队打靶练习:PHOTOGRAPHER: 1
  • 【Linux】网络诊断 traceroute命令详解
  • c#cad 创建-圆(二)
  • 面试高频知识点:2线程 2.1.5如何自定义实现一个线程池
  • 【stm32】hal库学习笔记-ADC模数转换(超详细)
  • 蓝桥杯基础知识6 pair
  • 后端返回给前端的数据格式有哪些?