Leetcode【1010】总持续时间可被 60 整除的歌曲

这篇具有很好参考价值的文章主要介绍了Leetcode【1010】总持续时间可被 60 整除的歌曲。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1010.总持续时间可被 60 整除的歌曲

最近忙于毕设,leetcode也就随缘刷刷每日一题了。

题目

在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。

返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望下标数字 ij 满足 i < j 且有 (time[i] + time[j]) % 60 == 0

示例1:

输入:time = [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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/pairs-of-songs-with-total-durations-divisible-by-60

解题思路

题目评论区有条评论说的好:”看到数据集大于1e5 就别想O(N^2)以上的时间复杂度了,指定过不了“。奈何本笨读完题目,还是控制不住自己提交了一份暴力解法:

class Solution:
    def numPairsDivisibleBy60(self, time: List[int]) -> int:
        n = len(time)
        count = 0
        for i in range(n-1):
            for j in range(i+1,n):
                if (time[i]+time[j])%60 == 0:
                    count += 1
        return count

毋庸置疑是运行超时了。然后我开始认真推敲题目,此时数组的什么对撞指针、滑动窗口等在我脑中冒出来,不过好像都用不上。然后点开题目下面的相关标签,里面发现“哈希表”这个关键词,想到了Pyhton的字典。于是有了下面的解法:

from math import comb

class Solution:
    def numPairsDivisibleBy60(self, time: List[int]) -> int:
        count = 0
        count_dict = dict.fromkeys(range(60), 0)
        for t in time:
            count_dict[t%60] += 1
        for i in range(0, 31):
            if i == 0 or i == 30:
                if count_dict[i]>1:
                    count += comb(count_dict[i], 2)
            else:
                count += count_dict[60 - i] * count_dict[i]
        return count

忽略掉我花了整整一个小时才想出来的这个解法,最后显示通过执行用时超过了91%的提交记录还是挺意外挺开心的hhh。

这里就不详细说我想的过程了,直接说下我的最终思路:建立一个字典,用于记录歌曲持续时间取模60所得值出现的次数。我们知道任意两个数相加能被60整除,意味着两个数分别取模60后所得结果相加为60,并且出现两者的次数相乘的结果便是题目中所需统计的歌曲对数量。对于取模结果为0和30的两个数,两两相加也满足要求,所以就是他们的组合对数。因为需要满足i<j,我们只用统计前半部分的歌曲对数即可,也就是0,[1,29], 30

后来发现其实不用调用组合的comb函数,n个数的两两组合个数为: n ( n − 1 ) / 2 n(n-1)/2 n(n1)/2。又可以精简一下:文章来源地址https://www.toymoban.com/news/detail-435883.html

class Solution:
    def numPairsDivisibleBy60(self, time: List[int]) -> int:
        count = 0
        count_dict = dict.fromkeys(range(60), 0)
        for t in time:
            count_dict[t%60] += 1
        for i in range(0, 31):
            if i == 0 or i == 30:
                count += count_dict[i]*(count_dict[i]-1)//2
            else:
                count += count_dict[60 - i] * count_dict[i]
        return count

到了这里,关于Leetcode【1010】总持续时间可被 60 整除的歌曲的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【1015. 可被 K 整除的最小整数】

    来源:力扣(LeetCode) 描述: 给定正整数 k ,你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。 返回 n 的长度。如果不存在这样的 n ,就返回 -1 。 注意: n 不符合 64 位带符号整数。 示例 1: 示例 2: 示例 3: 提示: 1 = k = 10 5 方法:遍历 思路与算法 题

    2024年02月03日
    浏览(61)
  • 【1262. 可被三整除的最大和】

    来源:力扣(LeetCode) 描述: 给你一个整数数组 nums ,请你找出并返回能被三整除的元素最大和。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 4 * 10 4 1 = nums[i] = 10 4 方法:贪心 + 正向思维 我们把数组中的数分成三部分 a, b, c,它们分别包含所有被 3 除余 0 , 1, 2 的数。显

    2024年02月10日
    浏览(29)
  • 和可被K整除的子数组(Java详解)

    目录 一、题目描述 二、题解 思路分析 具体实现 完整代码 给定一个整数数组  nums  和一个整数  k  ,返回其中元素之和可被  k  整除的(连续、非空)  子数组  的数目。 子数组  是数组的  连续  部分。 示例: 输入:nums = [4,5,0,-2,-3,1],k = 5 输出:7 输入:nums = [ 5 ],

    2024年02月01日
    浏览(27)
  • [Algorithm][前缀和][和为K的子数组][和可被K整除的子数组][连续数组][矩阵区域和]详细讲解

    和为 K 的子数组 分析 :因为有 负数 的存在 无法使用\\\" 双指针 \\\"优化,因为 区间求和不具备单调性 可能已经找到前缀和为k的子数组了,但是后面仍然可能会有更长的和为k的子数组存在 思路 :前缀和 + 哈希表 前缀和 : 以 i 位置为结尾 的所有的子数组 将问题转化为 :在

    2024年04月28日
    浏览(26)
  • 算法——前缀和之除自身以外数组的乘积、和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和

    这几道题对于我们前面讲过的一维、二维前缀和进行了运用,包含了面对特殊情况的反操作 目录 4.除自身以外数组的乘积 4.1解析 4.2题解 5.和为K的子数组 5.1解析 5.2题解 6.和可被K整除的子数组 6.1解析 6.2题解 7.连续数组 7.1题解 7.2题解 8.矩阵区域和 8.1解析 8.2题解 4.除自身以外

    2024年04月14日
    浏览(32)
  • lintcode 344 · 歌曲时间【背包问题,动态规划】

    https://www.lintcode.com/problem/344/ 我们先证明,时长最长的那首歌是一定会被选中的。如果不然,则可以将最后播放的那首歌替换成这个时长最长的,能得到更优解,矛盾。那么我们只考虑剩下的歌的选择。问题转化为,问总长度小于M MM的情况下,最长总时长是多少。这是个0 −

    2024年02月11日
    浏览(28)
  • 前端vue常见60道面试题 重点简洁!!!【未完,文章持续更新中......】

    model 代表数据模型,数据和业务逻辑都在 model 层中定义 view 代表视图,负责数据展示 view model 代表与界面对应的 model MVVM 是 MVC 的变种进阶,在概念上真正将页面与数据逻辑分离的模式,把数据绑定放到一个 js 中去实现,这个 js 文件主要功能是完成数据的双向绑定,把 mod

    2024年02月06日
    浏览(50)
  • LeetCode+ 56 - 60

    双指针算法、位运算、离散化、区间合并_小雪菜本菜的博客-CSDN博客

    2024年01月22日
    浏览(61)
  • 算法leetcode|60. 排列序列(rust重拳出击)

    给出集合 [1,2,3,...,n] ,其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: \\\"123\\\" \\\"132\\\" \\\"213\\\" \\\"231\\\" \\\"312\\\" \\\"321\\\" 给定 n 和 k ,返回第 k 个排列。 1 = n = 9 1 = k = n! 面对这道算法题目,二当家的再次陷入了沉思。 如果模拟,按顺序生成k个

    2024年02月12日
    浏览(34)
  • Java(106):Java获取当天或者明天等零点时间(00:00:00)的方法,获取当前时间后60秒或30天的时间

    Java获取当天或者明天等零点时间(00:00:00)的方法 执行结果: 其他: 获取当前时间后60秒的时间 获取当前时间的后 30天, 或者N天 Calendar now = Calendar.getInstance(); now.add(Calendar.Date, 30); Date date = now.getTime();

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包