Skip to content

Commit 242c377

Browse files
authored
feat: add solutions to lc problem: No.1285 (#1798)
No.1285.Find the Start and End Number of Continuous Ranges
1 parent 29bf43c commit 242c377

File tree

4 files changed

+83
-24
lines changed

4 files changed

+83
-24
lines changed

.prettierrc

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"solution/1100-1199/1174.Immediate Food Delivery II/Solution.sql",
2828
"solution/1100-1199/1193.Monthly Transactions I/Solution.sql",
2929
"solution/1200-1299/1205.Monthly Transactions II/Solution.sql",
30+
"solution/1200-1299/1285.Find the Start and End Number of Continuous Ranges/Solution.sql",
3031
"solution/1300-1399/1384.Total Sales Amount by Year/Solution.sql",
3132
"solution/1300-1399/1322.Ads Performance/Solution.sql",
3233
"solution/1300-1399/1393.Capital GainLoss/Solution.sql",

solution/1200-1299/1285.Find the Start and End Number of Continuous Ranges/README.md

+37-8
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,51 @@ Logs 表:
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
**方法一:分组 + 窗口函数**
67+
68+
我们需要想办法将一段连续的日志分到同一组,然后对每一组进行聚合操作,得到每一组的开始日志和结束日志。
69+
70+
分组可以用以下两种方法实现:
71+
72+
1. 通过计算每个日志与前一个日志的差值,如果差值为 $1$,则说明这两个日志是连续的,我们设置 $delta$ 为 $0$,否则设置为 $1$。然后我们对 $delta$ 求前缀和,得到的结果就是每一行的分组的标识符。
73+
2. 通过计算当前行的日志减去当前行的行号,得到的结果就是每一行的分组的标识符。
74+
6675
<!-- tabs:start -->
6776

6877
### **SQL**
6978

7079
```sql
71-
SELECT
72-
MIN(log_id) AS start_id,
73-
MAX(log_id) AS end_id
74-
FROM
75-
(
80+
# Write your MySQL query statement below
81+
WITH
82+
T AS (
83+
SELECT
84+
log_id,
85+
sum(delta) OVER (ORDER BY log_id) AS pid
86+
FROM
87+
(
88+
SELECT
89+
log_id,
90+
if((log_id - lag(log_id) OVER (ORDER BY log_id)) = 1, 0, 1) AS delta
91+
FROM Logs
92+
) AS t
93+
)
94+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
95+
FROM T
96+
GROUP BY pid;
97+
```
98+
99+
```sql
100+
# Write your MySQL query statement below
101+
WITH
102+
T AS (
76103
SELECT
77104
log_id,
78-
log_id - ROW_NUMBER() OVER (ORDER BY log_id) AS rk
105+
log_id - row_number() OVER (ORDER BY log_id) AS pid
79106
FROM Logs
80-
) AS t
81-
GROUP BY rk;
107+
)
108+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
109+
FROM T
110+
GROUP BY pid;
82111
```
83112

84113
<!-- tabs:end -->

solution/1200-1299/1285.Find the Start and End Number of Continuous Ranges/README_EN.md

+37-8
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,51 @@ Number 10 is contained in the table.
5959

6060
## Solutions
6161

62+
**Solution 1: Group By + Window Function**
63+
64+
We need to find a way to group a continuous sequence of logs into the same group, and then aggregate each group to obtain the start and end logs of each group.
65+
66+
There are two ways to implement grouping:
67+
68+
1. By calculating the difference between each log and the previous log, if the difference is $1$, then the two logs are continuous, and we set $delta$ to $0$, otherwise we set it to $1$. Then we take the prefix sum of $delta$ to obtain the grouping identifier for each row.
69+
2. By calculating the difference between the current log and its row number, we obtain the grouping identifier for each row.
70+
6271
<!-- tabs:start -->
6372

6473
### **SQL**
6574

6675
```sql
67-
SELECT
68-
MIN(log_id) AS start_id,
69-
MAX(log_id) AS end_id
70-
FROM
71-
(
76+
# Write your MySQL query statement below
77+
WITH
78+
T AS (
79+
SELECT
80+
log_id,
81+
sum(delta) OVER (ORDER BY log_id) AS pid
82+
FROM
83+
(
84+
SELECT
85+
log_id,
86+
if((log_id - lag(log_id) OVER (ORDER BY log_id)) = 1, 0, 1) AS delta
87+
FROM Logs
88+
) AS t
89+
)
90+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
91+
FROM T
92+
GROUP BY pid;
93+
```
94+
95+
```sql
96+
# Write your MySQL query statement below
97+
WITH
98+
T AS (
7299
SELECT
73100
log_id,
74-
log_id - ROW_NUMBER() OVER (ORDER BY log_id) AS rk
101+
log_id - row_number() OVER (ORDER BY log_id) AS pid
75102
FROM Logs
76-
) AS t
77-
GROUP BY rk;
103+
)
104+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
105+
FROM T
106+
GROUP BY pid;
78107
```
79108

80109
<!-- tabs:end -->
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
SELECT
2-
MIN(log_id) AS start_id,
3-
MAX(log_id) AS end_id
4-
FROM
5-
(
1+
# Write your MySQL query statement below
2+
WITH
3+
T AS (
64
SELECT
75
log_id,
8-
log_id - ROW_NUMBER() OVER (ORDER BY log_id) AS rk
6+
log_id-row_number() OVER (ORDER BY log_id) AS pid
97
FROM Logs
10-
) AS t
11-
GROUP BY rk;
8+
)
9+
SELECT min(log_id) AS start_id, max(log_id) AS end_id
10+
FROM T
11+
GROUP BY pid;

0 commit comments

Comments
 (0)