SQL练习——LeetCode解题和总结(2)
602. Friend Requests II: Who Has the Most Friends[M]
一、表信息
In social network like Facebook or Twitter, people send friend requests and accept others' requests as well.

table:request_accepted
二、题目信息
找出拥有好友数最多的用户编号及其拥有的好友数。所有的请求默认都被处理了。
注意:
- 只有一个用户拥有最多的好友数
- 好友邀请只能被接受一次,因此要去除重复值
For the sample data above, the result is:

三、参考SQL
1 WITH t1 AS ( SELECT DISTINCT requester_id, accepter_id FROM request_accepted597 ),
2 t2 AS ( SELECT requester_id AS id FROM t1 ),
3 t3 AS ( SELECT accepter_id AS id FROM t1 )
4
5 SELECT *
6 FROM
7 ( SELECT
8 id,
9 count( * ) AS num
10 FROM( SELECT id FROM t2 UNION ALL SELECT id FROM t3 ) temp
11 GROUP BY id
12 ) t
13 ORDER BY num DESC
14 LIMIT 1;
思路:
(你加别人或者别人加你,你都多了一个好友。所以无论你的ID是出现在requester_id还是accepter_id,都证明你多了一个好友)
1、t1用于去重。因为两个相同用户之间发送多次请求和接受,都只能算是同一个好友。(生活中的场景:以前初中用QQ的时候,暗恋同班一个女童鞋,要到了她的QQ,周一到周五晚上一放学就去网吧打毒奶粉,顺便加女神的QQ,但是女神没有回应,于是周一到周五每天都加了一次,谁知道女神是好同学,只有周五回家才上网,她周五回到家了把我周一到周五发送的所有请求加好友消息都同意了,我瞬间有了五个女朋友,嘻嘻。。。)
2、去重之后,用t2和t3分别把请求和相应的ID都提取出来,在union all把他们拼接在一起,得到temp表

3、此时问题就转化为id出现次数最多的问题了。分组——统计个数——倒序——截取第一个最大值即可
(PS:这里默认自己不能加自己为好友,也就是requester_id不等于accepter_id。记得以前QQ可以给自己发好友请求的。假若最多好友数不止一个人,或者求好友数前三的信息。就和前面的一些题目很李类似)
方法二:网友答案
1 SELECT c.people as id, SUM(c.cnt) AS num
2 FROM (
3 SELECT requester_id AS people, COUNT(DISTINCT accepter_id) AS cnt
4 FROM request_accepted
5 GROUP BY requester_id
6
7 UNION ALL
8
9 SELECT accepter_id AS people, COUNT(DISTINCT requester_id) AS cnt
10 FROM request_accepted
11 GROUP BY accepter_id
12 ) AS c
13
14 GROUP BY c.people
15 ORDER BY SUM(c.cnt) DESC
16 LIMIT 1;
思路:
1、子查询1:自己主动加了几个人
2、子查询2:有几个人主动加了我
3、把两个子查询拼接起来,就是我一共有几个好友
(PS:思路差不多,这两个子查询用的很妙,但是前提还是自己不能加自己为好友。注意union all 和 union distinct的区别!)
603. Consecutive Available Seats[E]
一、表信息
cinema表为某电影院选座情况,包含座位编号以及座位是否可选。
Several friends at a cinema ticket office would like to reserve consecutive available seats.

二、题目信息
找出连续座位的编号。
Can you help to query all the consecutive available seats order by the seat_id using the following cinema table?
注意:
- 座位编号是自动递增的整数型数据,是否可选是一个逻辑值 (1代表可选,0代表不可选)
- 连续座位可选指至少连续的两个座位是可以选的
Note:
- The seat_id is an auto increment int, and free is bool ('1' means free, and '0' means occupied.).
- Consecutive available seats are more than 2(inclusive) seats consecutively available.
Your query should return the following result for the sample case above.

三、参考SQL
方法一:
1 SELECT
2 seat_id
3 FROM
4 (
5 SELECT c1.seat_id AS seat_id
6 FROM cinema603 c1
7 INNER JOIN cinema603 c2
8 ON c1.free = c2.free AND c1.seat_id = c2.seat_id - 1
9 ) t1
10 UNION
11 (
12 SELECT c2.seat_id AS seat_id
13 FROM cinema603 c1
14 INNER JOIN cinema603 c2
15 ON c1.free = c2.free AND c1.seat_id = c2.seat_id - 1
16 )
17 ;
思路:
1、因为ID是自增的。连接条件,让下一个的free值等于上一个的free值,那么这两个座位就是可以连坐的。

2、在把两列拼接起来去重即可
方法二:官方答案
1 SELECT DISTINCT a.seat_id
2 FROM cinema603 AS a JOIN cinema603 AS b
3 ON ABS(a.seat_id - b.seat_id) = 1
4 AND a.free = TRUE AND b.free = TRUE
5 ORDER BY a.seat_id;
加绝对值,可以让表的id相差为1的记录连接两次。但是假若题目要求至少连续三个为1就不能这么写了。
607. Sales Person[E]
一、表信息
这题太简单
二、题目信息
三、参考SQL
608. Tree Node[M]
SQL练习——LeetCode解题和总结(2)的更多相关文章
- SQL练习——LeetCode解题和总结(1)
只用于个人的学习和总结. 178. Rank Scores 一.表信息 二.题目信息 对上表中的成绩由高到低排序,并列出排名.当两个人获得相同分数时,取并列名次,且名词中无断档. Write a SQ ...
- Leetcode解题思想总结篇:双指针
Leetcode解题思想总结篇:双指针 1概念 双指针:快慢指针. 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍. 在循环中的指针移动通常为: faster = f ...
- LeetCode解题报告:Linked List Cycle && Linked List Cycle II
LeetCode解题报告:Linked List Cycle && Linked List Cycle II 1题目 Linked List Cycle Given a linked ...
- leetcode解题报告(2):Remove Duplicates from Sorted ArrayII
描述 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...
- LeetCode解题记录(贪心算法)(二)
1. 前言 由于后面还有很多题型要写,贪心算法目前可能就到此为止了,上一篇博客的地址为 LeetCode解题记录(贪心算法)(一) 下面正式开始我们的刷题之旅 2. 贪心 763. 划分字母区间(中等 ...
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
- leetCode解题报告5道题(六)
题目一: Longest Substring Without Repeating Characters Given a string, find the length of the longest s ...
- LeetCode解题中位运算的运用
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
- Leetcode解题思路总结(Easy篇)
终于刷完了leetcode的前250道题的easy篇.好吧,其实也就60多道题,但是其中的套路还是值得被记录的. 至于全部code,请移步github,题目大部分采用python3,小部分使用C,如有 ...
随机推荐
- poj-3046 Ant Counting【dp】【母函数】
题目链接:戳这里 题意:有A只蚂蚁,来自T个家族,每个家族有ti只蚂蚁.任取n只蚂蚁(S <= n <= B),求能组成几种集合? 这道题可以用dp或母函数求. 多重集组合数也是由多重背包 ...
- Java中输出小数点后几位
笔试时候,遇到让你写输出小数点后几位,当时很是头疼,下来后,查了查发现,没什么难的.网上有各种情况都讨论了(一般分为4种),在这里我着重讨论一下比较实用,比较简单,比较方便操作的几种: 1 publi ...
- 2019牛客多校第二场E MAZE(线段树 + 矩阵)题解
题意: n * m的矩阵,为0表示可以走,1不可以走.规定每走一步只能向下.向左.向右走.现给定两种操作: 一.1 x y表示翻转坐标(x,y)的0.1. 二.2 x y表示从(1,x)走到(n,y) ...
- Polya定理应用实例
关于Polya原理的应用经典实例: 问题:用两种颜色去染排成一个圈的6个棋子,如果通过旋转得到只算作一种.问有多少种染色状态. 解:先将棋子表上号: 1 6 2 5 3 4 那么把所有通过旋转 ...
- ubuntu+将主机编译的库链接到虚拟环境Python中
这里且以opencv为例: cd ~/.virtualenvs/YOUR_ENV/lib/python3.5/site-packages/ ln -s /usr/local/lib/python3.5 ...
- GitHub new features 2020 All In One
GitHub new features 2020 All In One Discussions Discussions is the space for your community to have ...
- node.js module.exports & exports & module.export all in one
node.js module.exports & exports & module.export all in one cjs const log = console.log; log ...
- React.js vs Vue.js All in One
React.js vs Vue.js All in One React 与 Vue 区别对比 https://vuejs.org/v2/guide/comparison.html 1. 使用人数, 社 ...
- Microsoft Lifecycle Policy
Microsoft Lifecycle Policy The Microsoft Lifecycle Policy gives you consistent and predictable guide ...
- webpack defineConstants
webpack defineConstants PAGES 全局常量/全局变量 https://webpack.js.org/plugins/define-plugin/ taro https://n ...