这是小川的第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. noi.ac NA537 【Graph】

    本来以为过了...然后FST了... 吐槽:nmdGraph为什么不连通... 这题想法其实非常\(na\ddot{\imath}ve\),就是对于一个连通块先钦点一个点为根,颜色是\(1\),考虑到 ...

  2. java读取word文档,提取标题和内容

    使用的工具为poi,需要导入的依赖如下 <dependency> <groupId>org.apache.poi</groupId> <artifactId& ...

  3. mybatis 分页插件PageHelper的简单使用

    首先在pom.xml配置文件中增加相关的插件. 插件地址:https://github.com/pagehelper/Mybatis-PageHelper <dependency> < ...

  4. python字典的setdefault的妙用

    现在有一个员工字典,类似这样的结构 staff_dic = {"name":"灭霸", "age": 10000, "hobbie ...

  5. 【GDOI2018模拟7.9】期末考试

    题目 分析 如果我们确定最后的成绩公布日期t,那么就可以贪心来求出最小的不愉快度: 首先,那些希望的日期小于t的同学,会产生不愉快度,这个用前缀和可以来处理, 对于课程,我们要将大于t的课程全部拖到t ...

  6. 算法复习-P NP NPC NP-hard概念

    from http://blog.csdn.net/huang1024rui/article/details/49154507 P.NP.NPC和NP-Hard相关概念的图形和解释 一.相关概念 P: ...

  7. k8s测试容器test-for-k8s.yml

    生成容器 vim test-for-k8s.yml apiVersion: v1 kind: Pod metadata: name: busybox-curl labels: ccb: busybox ...

  8. head first 设计模式笔记7-适配器模式与外观模式

    适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容.这可以让客户从实现的接口解耦.如果在一 ...

  9. TTTTTTTTTTTTTTTTTTTTT POJ 3690 0与* 二维哈希 模板 +multiset

    Constellations Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5923   Accepted: 1164 De ...

  10. 【BZOJ3261】最大异或和(可持久化Trie)

    题意: 思路:可持久化Trie板子题,支持序列插入和询问 #include<bits/stdc++.h> using namespace std; typedef long long ll ...