当前位置: 首页 > wzjs >正文

学校网站建设需要注意什么房产交易中心官网

学校网站建设需要注意什么,房产交易中心官网,网页设计做网站首页,绿盒子网站建设案例最长连续序列和uthash.h LeetCode128. 最长连续序列(C语言实现)问题描述示例约束条件 解题思路C语言实现代码代码说明测试结果 uthash.h1. **HASH_ADD_INT**2. **HASH_FIND_INT**3. **HASH_ITER**4. **HASH_DEL**5. **HASH_COUNT**6. **HASH_CLEAR**总结…

最长连续序列和uthash.h

    • LeetCode128. 最长连续序列(C语言实现)
        • 问题描述
        • 示例
        • 约束条件
      • 解题思路
      • C语言实现代码
      • 代码说明
      • 测试结果
    • `uthash.h`
      • 1. **`HASH_ADD_INT`**
      • 2. **`HASH_FIND_INT`**
      • 3. **`HASH_ITER`**
      • 4. **`HASH_DEL`**
      • 5. **`HASH_COUNT`**
      • 6. **`HASH_CLEAR`**
      • 总结

LeetCode128. 最长连续序列(C语言实现)

问题描述

给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例
  1. 输入nums = [100, 4, 200, 1, 3, 2]
    输出4
    解释:最长数字连续序列是 [1, 2, 3, 4],其长度为 4。

  2. 输入nums = [0, 3, 7, 2, 5, 8, 4, 6, 0, 1]
    输出9
    解释:最长数字连续序列是 [0, 1, 2, 3, 4, 5, 6, 7, 8],其长度为 9。

  3. 输入nums = [1, 0, 1, 2]
    输出3
    解释:最长数字连续序列是 [0, 1, 2],其长度为 3。

约束条件
  • 0 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

解题思路

为了在 O(n) 时间复杂度内解决此问题,我们需要利用哈希表来快速查找元素是否存在。具体步骤如下:

  1. 构建哈希表:将数组中的所有元素插入到哈希表中,确保每个元素唯一。
  2. 遍历哈希表:对于每个元素,检查它是否是某个连续序列的起点(即检查 x-1 是否存在)。
  3. 查找连续序列:如果当前元素是序列的起点,则从该元素开始,逐个查找后续元素,直到找不到为止。
  4. 更新最大长度:记录每次找到的连续序列长度,并更新最长序列的长度。

C语言实现代码

以下是完整的C语言实现代码,使用了 uthash 库来实现哈希表功能。

#include <stdio.h>
#include <stdlib.h>
#include <uthash.h>// 定义哈希表结构体
typedef struct {int key; // 哈希集合保存的元素UT_hash_handle hh; // uthash 需要
} hashTable;// 函数:找出数字连续的最长序列长度
int longestConsecutive(int* nums, int numsSize) {hashTable* hashMap = NULL; // 创建一个空哈希集合hashTable* hashNode;// 构建哈希集合for (int i = 0; i < numsSize; i++) {int key = nums[i];HASH_FIND_INT(hashMap, &key, hashNode);if (hashNode == NULL) { // 如果 nums[i] 不在集合中,则插入hashNode = (hashTable*)malloc(sizeof(hashTable));hashNode->key = key;HASH_ADD_INT(hashMap, key, hashNode);}}int result = 0; // 初始化最大长度为0hashTable* current, *next; // 用于遍历哈希表的指针// 遍历哈希表中的每个节点HASH_ITER(hh, hashMap, current, next) {int x = current->key; // 当前节点的值hashTable* prevNode; // 用于检查前驱节点是否存在int prevKey = x - 1; // 前驱节点的键为 x-1HASH_FIND_INT(hashMap, &prevKey, prevNode);// 如果前驱节点存在,则跳过当前节点,因为当前节点不是序列的起点if (prevNode != NULL) {continue;}// 否则,当前节点是序列的起点,开始查找最长连续序列int end = x; // 连续序列的终点初始化为起点hashTable* temp; // 用于查找后继节点// 不断查找下一个节点,直到找不到时停止do {end++; // 假设下一个节点存在HASH_FIND_INT(hashMap, &end, temp); // 检查下一个节点是否存在} while (temp != NULL); // 如果存在,则继续查找// 计算当前连续序列的长度int currentLength = end - x;// 更新最大长度if (currentLength > result) {result = currentLength;}}// 清空哈希表,释放内存HASH_CLEAR(hh, hashMap);return result; // 返回最长连续序列的长度
}

代码说明

  1. 构建哈希表

    • 使用 uthash 库构建哈希表,将数组中的每个元素插入到哈希表中,确保每个元素唯一。
  2. 遍历哈希表

    • 遍历哈希表中的每个节点,检查当前节点是否为某个连续序列的起点。通过判断 x-1 是否存在,确定当前节点是否为序列的起点。
  3. 查找连续序列

    • 对于每个序列的起点,从该节点开始,逐个查找后续节点,直到找不到为止。
  4. 更新最大长度

    • 每次找到一个连续序列后,计算其长度,并更新最长序列的长度。
  5. 时间复杂度

    • 构建哈希表的时间复杂度为 O(n)
    • 遍历哈希表的时间复杂度为 O(n),每个元素最多被处理两次(一次在遍历时,一次在查找连续序列时)。
    • 因此,总时间复杂度为 O(n)

测试结果

  1. 输入nums = [100, 4, 200, 1, 3, 2]
    输出4
    解释:最长连续序列是 [1, 2, 3, 4]

  2. 输入nums = [0, 3, 7, 2, 5, 8, 4, 6, 0, 1]
    输出9
    解释:最长连续序列是 [0, 1, 2, 3, 4, 5, 6, 7, 8]

  3. 输入nums = [1, 0, 1, 2]
    输出3
    解释:最长连续序列是 [0, 1, 2]


uthash.h

uthash 是一个轻量级的哈希表库,广泛用于 C 语言中。以下是 uthash 的一些常用函数及其用法:

1. HASH_ADD_INT

用于向哈希表中添加一个整数键的节点。


HASH_ADD_INT(哈希表指针, 键字段名, 节点指针);
  • 哈希表指针:指向哈希表的指针。
  • 键字段名:结构体中存储键值的字段名。
  • 节点指针:指向要插入的节点的指针。

2. HASH_FIND_INT

在哈希表中查找一个整数键的节点。

HASH_FIND_INT(哈希表指针, 键值地址, 节点指针);
  • 哈希表指针:指向哈希表的指针。
  • 键值地址:键值的地址(通常用 & 取地址)。
  • 节点指针:用于存储查找结果的指针。

3. HASH_ITER

用于遍历哈希表中的所有节点。

HASH_ITER(UT_hash_handle字段名, 哈希表指针, 当前节点指针, 下一个节点指针);
  • UT_hash_handle字段名:结构体中 UT_hash_handle 类型字段的名称。
  • 哈希表指针:指向哈希表的指针。
  • 当前节点指针:用于存储当前节点的指针。
  • 下一个节点指针:用于存储下一个节点的指针。

4. HASH_DEL

从哈希表中删除一个节点。

HASH_DEL(哈希表指针, 节点指针);
  • 哈希表指针:指向哈希表的指针。
  • 节点指针:指向要删除的节点的指针。

5. HASH_COUNT

获取哈希表中节点的数量。

int count = HASH_COUNT(哈希表指针);
  • 哈希表指针:指向哈希表的指针。
  • 返回值:哈希表中节点的数量。

6. HASH_CLEAR

清空哈希表中的所有节点。

HASH_CLEAR(UT_hash_handle字段名, 哈希表指针);
  • UT_hash_handle字段名:结构体中 UT_hash_handle 类型字段的名称。
  • 哈希表指针:指向哈希表的指针。

总结

关键在于:

  1. 利用哈希表快速查找元素是否存在。
  2. 通过判断 x-1 是否存在,避免重复计算连续序列。
  3. 逐个查找后续节点,直到找不到为止。
    另外,要学会uthash.h使用,这才是最难的,不过多刷几题也就熟悉了。

文章转载自:

http://2iVlxJ2F.kfmLf.cn
http://yyHAmaPv.kfmLf.cn
http://nmSv0LQI.kfmLf.cn
http://LT6BZqAc.kfmLf.cn
http://IUY3h9Fn.kfmLf.cn
http://QJGQBid7.kfmLf.cn
http://D9zkvyQL.kfmLf.cn
http://uIjCdORk.kfmLf.cn
http://DQAHcO2b.kfmLf.cn
http://eZfP13ly.kfmLf.cn
http://DVWD5Njf.kfmLf.cn
http://ykLITAQK.kfmLf.cn
http://RoptriuR.kfmLf.cn
http://t5f6XfED.kfmLf.cn
http://M0Qg4vGP.kfmLf.cn
http://iRdjC75w.kfmLf.cn
http://9Ph2xGO8.kfmLf.cn
http://uxLg2apP.kfmLf.cn
http://bzVw9ixc.kfmLf.cn
http://kHvWy6ki.kfmLf.cn
http://JRBWZPiL.kfmLf.cn
http://3Hr80tBe.kfmLf.cn
http://mhnjaNaV.kfmLf.cn
http://3dZCO3XZ.kfmLf.cn
http://aWvJOzDq.kfmLf.cn
http://4fxJEQ2s.kfmLf.cn
http://AzoGatcE.kfmLf.cn
http://fErhEacK.kfmLf.cn
http://DtQiS5mL.kfmLf.cn
http://L9XAFvnj.kfmLf.cn
http://www.dtcms.com/wzjs/611586.html

相关文章:

  • 企业网站主页 优帮云温州企业模板建站
  • 西安网站优化公司wordpress如何接入h5
  • 网站建设概括门户网站建设的重要作用
  • 新闻类的网站如何做优化、石家庄建筑网
  • 兰州网站备案谁家做沙漠风网站建设6
  • 网站 后台 安装如何做阿里巴巴国际网站
  • 网站网站制作wordpress 获取 图片说明
  • 免费源码下载网站云南网站建设专业品牌
  • 建个注册页面网站酒店宣传推广方案
  • 手机影视网站制作合同协议模板
  • 免费.net网站空间綦江网站
  • 微信小程序开发网站建设中英文双语网站 滑动切换
  • 付费网站 源码 下载链接沈阳个人网站制作
  • 网站开发女生适合吗买个域名
  • 网站怎么做评论网络规划设计师怎么报名
  • 开封市网站建设公司中国网站排行榜前100名
  • 做网站遇到的困难总结丹东供求园
  • php网站开发最低配置wordpress定制主题
  • 网站转移空间以后ip会变化吗工作组赴沈阳爆炸现场
  • 嘉兴网站开发与制作如何制作一个报名微信小程序
  • 天津建设合同备案网站陕西高速公路建设集团网站
  • 创建一个行业网站多少钱做网页游戏网站需要什么
  • 深圳购物网站建设网络营销推广形式
  • 手机网站建站用哪个软件好公司入口网站app
  • 曲靖房地产网站开发无限资源免费视频有哪些下载
  • 中卫网站设计wordpress文章商品导购
  • 建筑设计网站app网页设计的主题有哪些
  • 兰溪市网站建设公司360免费建站官方
  • 曰本免费一级a做爰视频网站大连哪家科技公司做网站好
  • 邢台开发区建设小学官方网站济南网络营销策划公司