“21 天好习惯”第一期-12

目录

数据库专项:

leetcode每日一题:


数据库专项:

查询1:

        查询至少选修了学生201215122选修的全部课程的学生号码.

        逻辑转换: 查询学号为x的学生 , 对所有的课程y,只要20215122学生选修了的课程y, 则x也选修y.

        进而转化为: 不存在这样的课程y,学生20215122选修了 , 而学生x没有选.

 

select distict sno
from sc scx
where not exists (
    select *
    from sc scy
    where scy.sno = '20215122' and not exists (
        select *
        from sc scz
        where scz.sno = scx.sno and scz.cno = scy.cno
    )
)

leetcode每日一题:

次元门

昨天刚 "嘲讽" leetcode 一直来easy题 , 今天就来道困难题. (属实整破防了 .但是虽然看上去很吓人 , 做起来还是不难的.

        题意: 给你个二维矩阵 (即二维数组) , 每一个单元保存的是第三维的高度 (实际上就是构造出了一个三维的立体图像.). 第三维高度不一 , 所以又存在了接水问题. 问最多可接多少水.

        解题: 数据不大 , 很可能就是最朴素的解题方法. 高中应该也有接触过 "木桶原理" , 所以我们就来用 "木桶原理" 解题. 通过木桶原理我们可以知道 , 能装的水一定和最短的那块木板有关.

                 我们把最外层的一圈看作初始的木桶边缘 , 每次都用最短的木板周围的模板跟新边缘值. 跟新的情况分两种 : a. 当旧的边缘值大于周围的值时 , 说明这个新的结点说可以存储水的. 而这个结点的也将成为新的边缘值 且 高度为旧的边缘值. b. 当旧的边缘值小于周围的值时 , 说明这个结点的水是会流光的 (往旧的边缘流走 , 这很好理解) , 而新的边缘值将跟新成该结点. (max (height[i][j] , old) ).

                 边缘值是如上更新 , 那么我们应该如何求解能存储多少水呢? 因为水总是往最短的木板流走 , 所以我们每次更新短板都是从最短的那根就行跟新. 而水也只会从最短的木板流走 (这是必然的). 当边缘值大于结点的高度 , 说明水不会流走. 所以求解方法就是 当 old > height[i][j] 时 re += old - height[i][j].

        eg: 我们对第一个示例模拟 { [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] }.

首先所有的最外围木板进入优先队列. 经过优先队列排序 , 首先出来的应该是为高度为 1 的 height[0][3] , 它可以向下走到 height[1][3] , height[1][3] > height[0][3] , 所以新结点 (height[1][3]) 是无法存储水的. 然后将height[1][3]加入优先队列 , 作为木桶边缘. 假设接下来优先队列的排序使得 heigh[1][3]为等值最低点 , 那么height向左走到 height[1][2]. 因为 height[1][2] < height[1][3] , 所以这个新的结点是可以存储水的 , 但是这不是木桶边缘(因为旧结点大于它 , 水是流不出去的). 所以我们在求完该点可以存储的水量后 , 把 height[1][2] 置为边缘高度 (这防止了我们去爆搜边缘高度 , 也可以看做这里有个和边缘同高的水墙) 继续遍历.

        附上代码:

class Solution {
private:
    int a[4] = {1 , 0 , 0 , -1};
    int b[4] = {0 , 1 , -1 , 0};
    int re = 0;
public:
    int trapRainWater(vector<vector<int>>& heightMap) {
        if (heightMap.size() <= 2 || heightMap[0].size() <= 2) return 0; //剪枝.

        int n = heightMap.size() , m = heightMap[0].size();
        priority_queue< tuple<int , int , int> , vector<tuple<int , int , int>> , greater<tuple<int , int , int>> >p_que;
        vector<vector<bool>>bo(n + 5 , vector<bool>(m + 5 , 0));

        for(int i = 0;i < n;i ++) 
            bo[i + 1][1] = true , bo[i + 1][m] = true , p_que.push({heightMap[i][0] , i + 1 , 1}) , p_que.push({heightMap[i][m - 1] , i + 1 , m});
        for(int i = 0;i < m;i ++) 
            bo[1][i + 1] = true , bo[n][i + 1] = true , p_que.push({heightMap[0][i] , 1 , i + 1}) , p_que.push({heightMap[n - 1][i] , n , i + 1});

        while(!p_que.empty()){
            auto [val , x , y] = p_que.top();
            p_que.pop();

            for(int i = 0;i < 4;i ++){
                int x_next = x + a[i] , y_next = y + b[i];
                if(!bo[x_next][y_next] && x_next >= 1 && y_next >= 1 && x_next <= n && y_next <= m){
                    if(val > heightMap[x_next - 1][y_next - 1]) re += val - heightMap[x_next - 1][y_next - 1];

                    bo[x_next][y_next] = true;

                    p_que.push({max(val , heightMap[x_next - 1][y_next - 1]) , x_next , y_next});
                }
            }
        }

        return re;
    }
};

我们是这个时代的沙粒   藏在下个时代的蛰伏里. Day Twelve -- 微雨问海棠.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值