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

2024-02-09 03:52

本文主要是介绍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;
}

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

这篇关于2024.1.30力扣每日一题——使循环数组所有元素相等的最少秒数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693044

相关文章

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现