【连续】【二分查找】
2.1.1 连续题目
1、一个表中有uid、视频id、视频类型、访问时间,求连续4次刷同一类型视频的用户
uid,videoid、video_type、time
with a as 
(
    select
        uid,videoid,video_type,time,row_number() over(partition by uid order by time ) as rn 
    from
        v 
)
select
 a.uid 
from 
a 
inner join 
 a as b 
on 
 a.uid = b.uid and a.rn = b.rn- 1 and a,video_type = b.video_type
inner join 
 a as c 
on 
 b.uid = c.uid and b.rn = c.rn - 1 and b.video_type = c.video_type 
inner join 
 a as d 
on 
 c.uid = d.uid and c.rn = b.rn - 1 and c.video_type = d.video_type
group by 
 a.uid 
 
select
uid 
from
(
    select
        uid,video_id,video_type,time,lead(video_type,1) over(partition by uid order by time) as lead_video_type1,
        lead(video_type,2) over(partition by uid order by time) as lead_video_type2,
        lead(video_type,3) over(partition by uid order by time) as lead_video_type3
    from
        v
) as a 
where
 video_type = lead_video_type1 and video_type = lead_video_type2
 and video_type = lead_video_type3
group by 
uid
 
180. 连续出现的数字
SQL架构
表:Logs
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| num | varchar |
+-------------+---------+
id 是这个表的主键。
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:
示例 1:
输入:
Logs 表:
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
输出:
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
解释:1 是唯一连续出现至少三次的数字。
使用lead函数
# Write your MySQL query statement below
select
    num as ConsecutiveNums
from
(
    select  
        id,num,lead(num,1) over() as lead_num1,
        lead(num,2) over() as lead_num2
    from
        logs 
) as a 
where
    num - lead_num1 = 0 and num - lead_num2 = 0
group by 
    num 
正常解法
# Write your MySQL query statement below
select
    a.num as ConsecutiveNums
from
    logs as a 
inner join 
    logs as b 
on 
    a.num = b.num and a.id = b.id - 1
inner join 
    logs as c 
on  
    b.num = c.num and b.id = c.id -1
group by 
    a.num  
3、统计连续登陆的三天数和以上的用户以及他们的首次登录和最后登陆时间
select
 uid,min(dt) as min_dt,
 max(dt) as max_dt,
 count(1) as cnt 
from
(
    select
        uid,dt,rn,date_sub(dt,rn) as dt_rn
    from
    (
        select
            uid,dt,row_number() over(partition by uid order by dt) as rn
        from
            a 
    ) as b 
) as tmp 
group by 
 uid,dt_rn 
having
 count(1) >= 3 
33. 搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:
输入:nums = [1], target = 0
输出:-1
提示:
1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
nums 中的每个值都 独一无二
题目数据保证 nums 在预先未知的某个下标上进行了旋转
-10^4 <= target <= 10^4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:def search(self, nums: List[int], target: int) -> int:if not nums:return -1= 0,len(nums) - 1while left <= right:mid = left + (right - left) // 2if nums[mid] == target:return midelif nums[mid] < nums[right]:# 折点在左侧if nums[mid] < target <= nums[right]:left = mid + 1else:right = mid - 1else:# 这点在右侧if nums[left] <= target < nums[mid]:right = mid - 1else:left = mid + 1return -1
