C语言 | Leetcode C语言接雨水II

news2024/12/30 2:25:24

题目:

题解:

typedef struct{
    int row;
    int column;
    int height;
} Element;

struct Pri_Queue;
typedef struct Pri_Queue *P_Pri_Queue;
typedef Element Datatype;

struct Pri_Queue{
    int n;
    Datatype *pri_qu;
};

/*优先队列插入*/
P_Pri_Queue add_pri_queue(P_Pri_Queue pq, Datatype x){


    int i;

    if(pq->n == 0){
        pq->pri_qu[0] = x; pq->n ++; return(pq);
    }
    else{
        for(i = pq->n; (i > 0) && (x.height < pq->pri_qu[(i - 1) / 2].height); i = (i - 1) / 2){
            pq->pri_qu[i] = pq->pri_qu[(i - 1) / 2];
        }
    }

    pq->pri_qu[i] = x;
    pq->n ++;
    return(pq);
}

/*优先队列删除*/
P_Pri_Queue del_pri_queue(P_Pri_Queue pq){
    int i = 0;

    if(pq->n > 1){
        while(i <= (pq->n - 2) / 2){
            if((pq->pri_qu[pq->n - 1].height > pq->pri_qu[2 * i + 1].height) || \
                ((2 * i + 2 <= pq->n - 1) && (pq->pri_qu[pq->n - 1].height > pq->pri_qu[2 * i + 2].height))){

                if(2 * i + 2 <= pq->n - 1){
                    if(pq->pri_qu[2 * i + 1].height > pq->pri_qu[2 * i + 2].height){
                        pq->pri_qu[i] = pq->pri_qu[2 * i + 2];
                        i = 2 * i + 2;
                    }
                    else{
                        pq->pri_qu[i] = pq->pri_qu[2 * i + 1];
                        i = 2 * i + 1;
                    }
                }
                else{
                    pq->pri_qu[i] = pq->pri_qu[2 * i + 1];
                    i = 2 * i + 1;
                }
            }
            else{
                pq->pri_qu[i] = pq->pri_qu[pq->n - 1];
                pq->n --;
                return(pq);
            }
        }
    }

    pq->pri_qu[i] = pq->pri_qu[pq->n - 1];
    pq->n --;
    return(pq);
}

int trapRainWater(int** heightMap, int heightMapSize, int* heightMapColSize){
    if((heightMapSize < 3) || (*heightMapColSize < 3)) return(0);

    int Used_heightMap[112][112] = {0}, i, j, ans = 0;
    int direct[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    Datatype x;


    P_Pri_Queue pq;
    pq = (P_Pri_Queue)malloc(sizeof(struct Pri_Queue));
    pq->n = 0; pq->pri_qu = (Datatype*)malloc(sizeof(Datatype) * heightMapSize * (*heightMapColSize));

    for(i = 0; i < heightMapSize + 2; i ++) Used_heightMap[i][0] = 1;
    for(i = 0; i < heightMapSize + 2; i ++) Used_heightMap[i][1] = 1;
    for(i = 0; i < heightMapSize + 2; i ++) Used_heightMap[i][*heightMapColSize] = 1;
    for(i = 0; i < heightMapSize + 2; i ++) Used_heightMap[i][*heightMapColSize + 1] = 1;
    for(j = 0; j < *heightMapColSize + 2; j ++) Used_heightMap[0][j] = 1;
    for(j = 0; j < *heightMapColSize + 2; j ++) Used_heightMap[1][j] = 1;
    for(j = 0; j < *heightMapColSize + 2; j ++) Used_heightMap[heightMapSize][j] = 1;
    for(j = 0; j < *heightMapColSize + 2; j ++) Used_heightMap[heightMapSize + 1][j] = 1;

    for(i = 1; i < heightMapSize - 1; i ++){
        x.row = i; x.column = 0; x.height = heightMap[i][0];
        add_pri_queue(pq, x);
    }
    for(i = 1; i < heightMapSize - 1; i ++){
        x.row = i; x.column = *heightMapColSize - 1; x.height = heightMap[i][*heightMapColSize - 1];
        add_pri_queue(pq, x);
    }
    for(j = 1; j < *heightMapColSize - 1; j ++){
        x.row = 0; x.column = j; x.height = heightMap[0][j];
        add_pri_queue(pq, x);
    }
    for(j = 1; j < *heightMapColSize - 1; j ++){
        x.row = heightMapSize - 1; x.column = j; x.height = heightMap[heightMapSize - 1][j];
        add_pri_queue(pq, x);
    }

    while(pq->n > 0){
        for(i = 0; i < 4; i ++){
            if(Used_heightMap[pq->pri_qu[0].row + 1 + direct[i][0]][pq->pri_qu[0].column + 1 + direct[i][1]] == 0){
                if(heightMap[pq->pri_qu[0].row + direct[i][0]][pq->pri_qu[0].column + direct[i][1]] < pq->pri_qu[0].height){
                    ans += pq->pri_qu[0].height - heightMap[pq->pri_qu[0].row + direct[i][0]][pq->pri_qu[0].column + direct[i][1]];
                    x.height = pq->pri_qu[0].height;
                }
                else{x.height = heightMap[pq->pri_qu[0].row + direct[i][0]][pq->pri_qu[0].column + direct[i][1]];}

                x.row = pq->pri_qu[0].row + direct[i][0]; x.column = pq->pri_qu[0].column + direct[i][1];
                add_pri_queue(pq, x);
                Used_heightMap[pq->pri_qu[0].row + 1 + direct[i][0]][pq->pri_qu[0].column + 1 + direct[i][1]] = 1;
            }
        }

        //printf("row = %d, column =  %d, height = %d, n = %d\n", pq->pri_qu[0].row, pq->pri_qu[0].column, pq->pri_qu[0].height, pq->n);
        del_pri_queue(pq);
        //printf("row = %d, column =  %d, height = %d, n = %d\n", pq->pri_qu[0].row, pq->pri_qu[0].column, pq->pri_qu[0].height, pq->n);
    }

    return(ans);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

自己建网站怎么建

自己建立一个网站可能听起来有点复杂&#xff0c;但实际上&#xff0c;有很多简单且免费的方法可以实现。下面将介绍一些基本步骤&#xff0c;帮助你开始自己建立一个网站。 首先&#xff0c;你需要明确你的网站目的是什么。是个人博客、商业网站&#xff0c;还是其他类型的网…

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样&#xff0c;可以在不知道对象具体类型的条…

如何在webots中搭建一个履带机器人

前期准备 下载webotswebots基本知识 a. 官方文档:Webots documentation: Track b. B站教程:webots-超详细入门教程(2020)_哔哩哔哩_bilibili搭建流程 搭建履带机器人主要使用到了webots中的track节点,这个节点是专门用来定义履带的相关属性,模拟履带运动的 首先,创建一个…

MyBatis操作数据库-XML实现

目录 1.MyBatis的简单介绍 2.MyBatis操作数据库的步骤 2.1 添加依赖 2.2 配置文件 2.3 写持久层代码 2.4 方法测试 3.MyBatis操作数据库(增删查改) 3.1 CRUD标签 3.2 参数传递 3.3 Insert-新增 3.4 Delete-删除 3.5 Update-修改 3.6 Select-查询(映射问题) 1.MyB…

PAT甲级-1055 The World‘s Richest

题目 题目大意 输入给出富人的总数以及富人的姓名、年龄、财富&#xff0c;接下来的k行给出需要排序的个数&#xff0c;每个排序要求输出m个富人&#xff0c;并且限制了年龄段&#xff0c;[Amin, Amax]。要求输出所有的排序。如果满足年龄段的人数为0&#xff0c;就输出None。…

VSCode 离线安装中文语言包

1.插件市场 Extensions for Visual Studio family of products | Visual Studio Marketplace 输入&#xff1a; language 在version history里面下载相应的版本&#xff0c;若没有就下载最新的 在下面安装 安装完重启就可以了。 可能会提示的失败&#xff1a; Unable to ins…

整数二分算法和浮点数二分算法

整数二分算法和浮点数二分算法 二分 现实中运用到二分的就是猜数字的游戏 假如有A同学说B同学所说数的大小&#xff0c;B同学要在1~100中间猜中数字65&#xff0c;当B同学每次说的数都是范围的一半时这就算是一个二分查找的过程 二分查找的前提是这个数字序列要有单调性 基…

浅谈树形结构——特殊的树——二叉树

文章目录 一、什么是二叉树&#xff1f;二、二叉树的特点三、二叉树的性质四、两种特殊的二叉树4.1、满二叉树4.2、完全二叉树 五、一些关于二叉树特性的习题六、二叉树的存储[代码实现]6.1、链式存储6.2、顺序存储 七、二叉树的遍历7.1、关于二叉树遍历的选择题练习 一、什么是…

Linux系统终端中文件权限的10位字符是什么意思

Linux操作系统终端长格式显示的文件 在Linux操作系统终端中用文件长格式命令ls -l显示文件&#xff0c;如上图。第一列10个字符表示的含义如下&#xff1a; drwxrwxrwx 第一个字符是表示该文件的类型&#xff0c;如红色d表示该文件是一个目录&#xff0c;详细内容可以参考我…

ROS 编程入门的介绍

2.1 创建 ROS 功能包 ROS&#xff08;Robot Operating System&#xff09;是一种开源的机器人软件框架&#xff0c;广泛用于机器人开发中。通过使用 ROS&#xff0c;开发者可以轻松创建和管理机器人应用程序。在本节中&#xff0c;我们将介绍如何创建一个 ROS 功能包并实现一些…

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)

1. 安装 npm i amap/amap-jsapi-loader --save移步&#xff1a;官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

以root用户登陆ubuntu的桌面环境

前言 在学习Linux的时候&#xff0c;经常都需要使用sudo权限来对配置文件进行修改&#xff0c;常用的方法就是用vim编辑器在命令行界面进行修改&#xff0c;比如sudo vim /etc/profile&#xff0c;但我觉得每次都用命令行挺麻烦的&#xff0c;于是&#xff01;&#x1f913;我…

【零散技术】Odoo17通过Controller下载PDF

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo作为一款开源ERP&#xff0c;拥有极佳的拓展性&#xff0c;Odoo的Controller框架也让它具备了作为微信小程序后端的能力&#xff0c;那么就存在 需要通过小程序来下载PDF的业务情况。 目录 1.功能代码 1.1 manifest 设置 …

neo4j 图数据库使用教程

文章目录 neo4j 图数据库使用教程1&#xff09; 下载2&#xff09;安装3&#xff09; 创建数据4&#xff09;查询数据5&#xff09; 更新数据6&#xff09; 建立索引 neo4j 图数据库使用教程 1&#xff09; 下载 neo4j下载地址 http://dist.neo4j.org/neo4j-community-3.5.2…

【C++前后缀分解】1888. 使二进制字符串字符交替的最少反转次数|2005

本文涉及知识点 C前后缀分解 LeetCode1888. 使二进制字符串字符交替的最少反转次数 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次&#xff1a; 类型 1 &#xff1a;删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 &#xff1a;选择 字符…

redis群集三种模式:主从复制、哨兵、集群

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…

合宙Air201模组LuatOS扩展功能:温湿度传感器篇!

通过前面几期的学习&#xff0c;同学们的学习热情越来越高。 合宙Air201模组除了支持3种定位方式外&#xff0c;还具有丰富的扩展功能&#xff0c;比如&#xff1a;通过外扩BTB链接方案&#xff0c;最多可支持21个IO接口&#xff1a;SPI、I2C、UART等多种接口全部支持。 本期…

【时时三省】(C语言基础)指针进阶 例题8

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 第一个打印2 a6不管它是多大 前面是&#xff1d;s 都得变成两个字节 所以打印2 第二个打印5 sizeof里面的表达式是不参与运算的 所以打印5 上面所有例题总结…