这是小川的第377次更新,第405篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第239题(顺位题号是1010)。在歌曲列表中,第i首歌曲的持续时间为[i]秒。

返回其总持续时间(以秒为单位)可被60整除的歌曲对的数量,即当i <j时,(time[i] + time[j])%60 == 0

例如:

输入:[30,20,150,100,40]

输出:3

说明:三对总持续时间可被60整除:

(time[0] = 30,time[2] = 150):总持续时间180

(time[1] = 20,time[3] = 100):总持续时间120

(time[1] = 20,time[4] = 40):总持续时间60

输入:[60,60,60]

输出:3

说明:所有三对的总持续时间为120,可被60整除。

注意

  • 1 <= time.length <= 60000

  • 1 <= time[i] <= 500

02 第一种解法

暴力解法,使用两层for循环,但是会超时。

public int numPairsDivisibleBy60(int[] time) {
int count = 0, n = time.length;
for (int i=0; i<n; i++) {
for (int j=i+1; j<n; j++) {
if ((time[i]+time[j])%60 == 0) {
count++;
}
}
}
return count;
}

03 第二种解法

我们需要将时间复杂度降到O(N),就得重新考虑time中的元素值特性。

例如[30,20,150,100,40],其中30和150可以配对,20和100可以配对,20和40可以配对,这三对数之和都可以被60整除,那我们可以事先就将这些数简化一步,对60取余,得到[30,20,30,40,40],新的数范围是[0,59],那么只要后面出现的数能在前面找到一个数,两者互补(即两者之和等于60的倍数),即60-temp = temp2; temp2temp的后面出现,变成伪代码就是60-time[i]%60

但是换到另外一个例子上来看,[60,60,60],取余后变成了[0,0,0],再用60去减,发现没有可以配对的数,那我们就再取余一次,即(60-time[i]%60)%60,这样就可以处理那些本身是60的倍数的数。

思路:先对time中的数用60进行取余运算,使用一个HashMapkey为新数组的元素值,value为出现次数,遍历新数组中的元素num,找到(60-num)%60HashMap中的value值,进行累加,最后输出。

public int numPairsDivisibleBy602(int[] time) {
for (int i=0; i<time.length; i++) {
time[i] %= 60;
}
int count = 0;
Map<Integer, Integer> map = new HashMap<Integer,Integer>();
for (int num : time) {
count += map.getOrDefault((60-num)%60, 0);
map.put(num, map.getOrDefault(num, 0)+1);
}
return count;
}

04 第三种解法

思路和第二种解法一样,将HashMap换成int数组。

public int numPairsDivisibleBy603(int[] time) {
int[] count = new int[60];
int result = 0;
for (int num : time) {
result += count[(60-num%60)%60];
count[num%60]++;
}
return result;
}

05 小结

算法专题目前已连续日更超过七个月,算法题文章245+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,好看、留言、转发就是对我最大的回报和支持!

LeetCode.1010-歌曲总长度可被60整除的对数的更多相关文章

  1. Leetcode 1013. 总持续时间可被 60 整除的歌曲

    1013. 总持续时间可被 60 整除的歌曲  显示英文描述 我的提交返回竞赛   用户通过次数450 用户尝试次数595 通过次数456 提交次数1236 题目难度Easy 在歌曲列表中,第 i 首 ...

  2. 力扣(LeetCode) 1010. 总持续时间可被 60 整除的歌曲

    在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒. 返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量.形式上,我们希望索引的数字 i < j 且有 (time[i] + ...

  3. [Swift]LeetCode1010. 总持续时间可被 60 整除的歌曲 | Pairs of Songs With Total Durations Divisible by 60

    In a list of songs, the i-th song has a duration of time[i] seconds. Return the number of pairs of s ...

  4. 1013. Pairs of Songs With Total Durations Divisible by 60总持续时间可被 60 整除的歌曲

    网址:https://leetcode.com/problems/pairs-of-songs-with-total-durations-divisible-by-60/submissions/ 参考 ...

  5. 一条直线上N个线段所覆盖的总长度

    原文:http://blog.csdn.net/bxyill/article/details/8962832 问题描述: 现有一直线,从原点到无穷大. 这条直线上有N个线段.线段可能相交. 问,N个线 ...

  6. Mongoose 分页查询优化、获取数据总长度

    无论是传统网页还是 ajax api,我们都不得不进行数据分页,一来节省带宽二来提升页面响应速度.作为一个数据完备的 web 应用,做好分页功能能极大提升用户体验. 简单的分页查询 在 mongoos ...

  7. js 只能输入英文和数字,且首位必须是字母,字母总数不能超过3个,总长度不能超过20!

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. LeetCode:第K个排列【60】

    LeetCode:第K个排列[60] 题目描述 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: &quo ...

  9. LeetCode 209:最小长度的子数组 Minimum Size Subarray Sum

    公众号: 爱写bug(ID:icodebugs) 作者:爱写bug 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子 ...

随机推荐

  1. zabbix监控win服务器

    https://jingyan.baidu.com/article/fcb5aff76486f2edaa4a712a.html 卸载win上的zabbix: cmd /c "C:\zabbi ...

  2. win服务器安装sftp服务端

    工作环境中常常会用要下载数据或者是让对端推送数据到本地服务器上,当传输的数据比较重要时,可以使用基于安全文件传输协议(sftp)来实现需求. 本人在工作环境中就遇到这样的情况,局方给我们推送数据,要求 ...

  3. python_多线程多进程

    多线程,适用于IO密集型任务 IO,input,output缩写,包括网路io(比如上传下载),磁盘io,(比如数据库读写),CPU操作不频繁 多进程,适用于CPU密集型任务 数据分析,算法,依赖CP ...

  4. 【UOJ #46】 【清华集训2014】玄学

    题目描述 巨酱有 n 副耳机,他把它们摆成了一列,并且由 1 到n依次编号.每个耳机有一个玄学值,反映了各自的一些不可名状的独特性能.玄学值都是 0 到 m-1 间的整数.在外界的作用下(包括但不限于 ...

  5. Struts2拦截器和过滤器的区别?

    ①过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器. ②Struts2 拦截器只能对Action请求起作用,而过滤器则可以对几乎所 有请求起作用. ③拦截器可以访问 Action上下 ...

  6. TCP定时器 之 坚持定时器

    坚持定时器在接收方通告接收窗口为0,阻止发送端继续发送数据时设定. 由于连接接收端的发送窗口通告不可靠(只有数据才会确认,ACK不会确认),如果一个确认丢失了,双方就有可能因为等待对方而使连接终止:接 ...

  7. vue动态构造下拉

    在点击菜单的进入后台初始化方法 @RequestMapping("/init") public String init(@ModelAttribute("response ...

  8. leetcode 51 N皇后问题

    代码,由全排列转化而来,加上剪枝,整洁的代码: 共有4个变量,res(最终的结果),level,当前合理的解,n皇后的个数,visit,当前列是否放过皇后,由于本来就是在新的行方皇后,又通过visit ...

  9. electron--Tray添加图标和上下文菜单到系统通知区(系统托盘)

    const { app, Menu, Tray } = require('electron'); //系统托盘图标目录 appTray = new Tray(path.join(__dirname, ...

  10. 浏览器端-W3School-JavaScript:History 对象

    ylbtech-浏览器端-W3School-JavaScript:History 对象 1.返回顶部 1. History 对象 History 对象 History 对象包含用户(在浏览器窗口中)访 ...