首页 > 其他分享 >leetcode 1809 没有广告的剧集

leetcode 1809 没有广告的剧集

时间:2024-09-11 09:36:15浏览次数:1  
标签:customer end start t2 1809 id 剧集 time leetcode

 

表:Playback

+-------------+------+
| Column Name | Type |
+-------------+------+
| session_id  | int  |
| customer_id | int  |
| start_time  | int  |
| end_time    | int  |
+-------------+------+
session_id 是该表中具有唯一值的列。
customer_id 是观看该剧集的客户的 id。
剧集播放时间包含start_time(开始时间) 及 end_time(结束时间)
可以保证的是,start_time(开始时间)<= end_time(结束时间),一个观众观看的两个剧集的时间不会出现重叠。

 

表:Ads

+-------------+------+
| Column Name | Type |
+-------------+------+
| ad_id       | int  |
| customer_id | int  |
| timestamp   | int  |
+-------------+------+
ad_id 是该表中具有唯一值的列。
customer_id 为 观看广告的用户 id
timestamp 表示广告出现的时间点

 

编写解决方案找出所有没有广告出现过的剧集。

返回结果 无顺序要求 。

返回结果格式如下例所示:

 

示例 1:

输入:
Playback table:
+------------+-------------+------------+----------+
| session_id | customer_id | start_time | end_time |
+------------+-------------+------------+----------+
| 1          | 1           | 1          | 5        |
| 2          | 1           | 15         | 23       |
| 3          | 2           | 10         | 12       |
| 4          | 2           | 17         | 28       |
| 5          | 2           | 2          | 8        |
+------------+-------------+------------+----------+
Ads table:
+-------+-------------+-----------+
| ad_id | customer_id | timestamp |
+-------+-------------+-----------+
| 1     | 1           | 5         |
| 2     | 2           | 17        |
| 3     | 2           | 20        |
+-------+-------------+-----------+
输出:
+------------+
| session_id |
+------------+
| 2          |
| 3          |
| 5          |
+------------+
解释:
广告1出现在了剧集1的时间段,被观众1看到了。
广告2出现在了剧集4的时间段,被观众2看到了。
广告3出现在了剧集4的时间段,被观众2看到了。
我们可以得出结论,剧集1 、4 内,起码有1处广告。 剧集2 、3 、5 没有广告。

方案1

解题答案:
# 解题答案1 .

select
    session_id
from
    Playback p left join Ads a
on
    p.customer_id = a.customer_id
group by
    1
having
    sum(case when a.timestamp between p.start_time and p.end_time then 0 else 1 end) = count(1);

 

验证答案.

SELECT session_id 
,SUM(CASE when timestamp between start_time AND end_time then 0 else 1 end) a 
,count(1) b --这个是重点. FROM Playback ASt1 LEFT JOIN ads AS t2 USING(customer_id) GROUP BY 1 #HAVING SUM(CASE when timestamp between start_time AND end_time then 0 else 1 end) = count(1);

如下是输出结果:
| session_id | a | b |
| ---------- | - | - |
| 1 | 0 | 1 |
| 2 | 1 | 1 |
| 3 | 2 | 2 |
| 4 | 0 | 2 |
| 5 | 2 | 2 | a 代表当 广告时间在 剧情时间中的话,返回0 , 不在的话返回1 , 不断累加. 如果所有seession_id都不在则 count(1)和sum里的值相等.

 

方案2 : 
SELECT
DISTINCT session_id
FROM Playback AS t1
LEFT JOIN Ads AS t2 ON t1.customer_id = t2.customer_id 
AND t2.timestamp BETWEEN t1.start_time AND t1.end_time
WHERE t2.customer_id IS NULL;
SELECT
t1.*,t2.*
FROM Playback AS t1
LEFT JOIN Ads AS t2 ON t1.customer_id = t2.customer_id 
AND t2.timestamp BETWEEN t1.start_time AND t1.end_time
 #WHERE t2.customer_id IS NULL;

| session_id | customer_id | start_time | end_time | ad_id | customer_id | timestamp |
| ---------- | ----------- | ---------- | -------- | ----- | ----------- | --------- |
| 1          | 1           | 1          | 5        | 1     | 1           | 5         |
| 2          | 1           | 15         | 23       | null  | null        | null      |
| 3          | 2           | 10         | 12       | null  | null        | null      |
| 4          | 2           | 17         | 28       | 3     | 2           | 20        |
| 4          | 2           | 17         | 28       | 2     | 2           | 17        |
| 5          | 2           | 2          | 8        | null  | null        | null      |

 





标签:customer,end,start,t2,1809,id,剧集,time,leetcode
From: https://www.cnblogs.com/mengbin0546/p/18407682

相关文章

  • LeetCode算法—双指针
    一:普通双指针1、题目1:两数求和-1(1)方法1:普通双指针思路:定义两个指针;第一个指针放在数组的首位;第二个指针放在下一个元素的位置;然后遍历这个;如果两个元素的和为目标值就返回对对应的下标和索引值!deffuc(nums,target):foriinrange(len(nums)):forjinrange(i......
  • 72. 编辑距离(leetcode)
    https://leetcode.cn/problems/edit-distance/classSolution{publicintminDistance(Stringword1,Stringword2){//经典题编辑距离//f[i][j]表示word1前i个字符中选择进行操作,word2前j个字符进行选择进行操作相同的最少步数//以word1[......
  • 583. 两个字符串的删除操作(leetcode)
    https://leetcode.cn/problems/delete-operation-for-two-strings/solutions/两种做法,1.直接dp2.转换题意,思考成LCSclassSolution{publicintminDistance(Stringword1,Stringword2){//编辑距离的简化版//f[i][j]表示word1前i个字符中选择,wo......
  • LeetCode Hot100刷题记录-234.回文链表
    题目:给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。PS:回文序列是向前和向后读都相同的序列。解题思路:遍历链表,将每个元素存放入一个新的数组中。遍历完成后,再用两个指针前后遍历数组来判断两个数字是否相等。/***Def......
  • 线性dp:LeetCode122.买卖股票的最佳时机ll
    买卖股票本文所讲解的内容与LeetCode122.买卖股票的最佳时机ll,这道题题意相同,阅读完本文后可以自行挑战一下力扣链接题目叙述:给定一个长度为N的数组,数组中的第i个数字表示一个给定股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交......
  • leetcode day06 动态规划之解码方法I和II
    91.解码方法该题类似于爬楼梯方法一:动态规划对于给定的字符串s,设它的长度为n,其中的字符从左到右依次为s[1],s[2],⋯,s[n]。我们可以使用动态规划的方法计算出字符串s的解码方法数。具体地,设f i 表示字符串s的前i个字符s[1..i]的解码方法数。在进行状态转移......
  • LeetCode之数组/字符串
    88.合并两个有序数组classSolution{publicvoidmerge(int[]nums1,intm,int[]nums2,intn){//这个循环将nums2中的元素逐个复制到nums1中从索引m开始的位置for(inti=0;i<n;i++){nums1[i+m]=nums2[i];......
  • LeetCode: 2552. 统计上升四元组 动态规划 时间复杂度O(n*n)
    2552.统计上升四元组today2552.统计上升四元组题目描述给你一个长度为n下标从0开始的整数数组nums,它包含1到n的所有数字,请你返回上升四元组的数目。如果一个四元组(i,j,k,l)满足以下条件,我们称它是上升的:0<=i<j<k<l<n且nums[i]<nums[k]<num......
  • 115. 不同的子序列(leetcode)
    https://leetcode.cn/problems/distinct-subsequences/submissions/563375885/这题比较有难度,具体不太好想到,需要以是否选择s[i]来划分子集这位描述的很清楚,不做过多赘述classSolution{publicintnumDistinct(Strings,Stringt){//f[i][j]表示s中前i个......
  • Leetcode3264. K 次乘运算后的最终数组 I
    EverydayaLeetcode题目来源:3264.K次乘运算后的最终数组I解法1:模拟操作:遍历数组nums,找到其中的最小值x,如果存在多个最小值,选择最前面的一个。将它乘以multiplier。共执行k次操作。代码:/**@lcapp=leetcode.cnid=3264lang=cpp**[3264]K次乘运算......