IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 简单哈希表,计数哈希,c++ -> 正文阅读

[数据结构与算法]简单哈希表,计数哈希,c++

哈希常用来提速,以空间换时间,看到时间很快,内存很大不要诧异

#include <stdio.h>//这是c语言
#include <string.h>
#define maxn 1000001
int hash[maxn];//定义一个较大的数组
int main() {
    int n, x;
    int i, j;
    int hasPrint;//hasprint有个很重要的作用就是判断这个数是否已经出现过了
    while(scanf("%d", &n) != EOF) {   
        memset(hash, 0, sizeof(hash)); //将哈希数组中的所有元素都赋值为0        
        while(n--) {
            scanf("%d", &x);//输入n组数据,即n个x
            ++hash[x];  //将下标为x的位置加1                    
        }
        hasPrint = 0;//刚开始置为0
        for(i = 0; i < maxn; ++i) {//遍历所有数      
            if(hash[i]) {//如果不为0
                for(j = 0; j < hash[i]; ++j) {//hash[i]里面存的数就是x的个数
                    if(hasPrint) {//如果已经输出过数就输出一个空格
                         printf(" ");   
                    }
                    printf("%d", i);//输出这个i,即为x
                    hasPrint = 1;//证明已经输出过数字了
                }
            }
        }
        printf("\n");//换行准备输入下一组数据
    }
    return 0;
}//这就是一个不用排序用哈希把一组无序的数字排列有序

其实这种排序不算是排序,而是将输入的x变为数组下标,然后记录x的数量,因为前面已将数组清0,所以只需要遍历所有数寻找不为0的那个数组下标,对应的输出i值,就相当于排序了

下面有几道力扣的类似题

448. 找到所有数组中消失的数字 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=LA92https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/在介绍代码之前我要介绍一下auto &num:nums,这个在for循环中就代表了遍历nums数组,称不上数组,其实是array和vector容器,是c++中特有的遍历方式,&是一个引用符号,只需要记住

遍历nums中的每一个数,num就是数组中的数字,下面的代码将能更加详细的理解这

理解之后我们看题

?

//这是c++做法
class Solution {//核心思想将nums看做哈希
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
int n=nums.size();
for(auto &num:nums)
{
    nums[(num-1)%n]+=n;//主要思想就是遍历数组,找出小于n的数,则证明这个数未出现过,其中有一种特判就是[1,1]这就是用num-1的愿意
}
vector<int>ret;
int l=0;
for(int i=0;i<n;i++)
{
    if(nums[i]<=n)
    {
        ret.push_back(i+1);//vector库函数
    }
}
return ret;
    }
};
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
int *hash=(int *)malloc(sizeof(int)*(numsSize+1));//c语言哈希较慢
int *ret=(int *)malloc(sizeof(int)*(numsSize+1));
memset(hash,0,sizeof(int)*(numsSize+1));
for(int i=0;i<numsSize;i++)
{
    ++hash[nums[i]];//计数,思想就是出现的数都会递增,而未出现的数则为0
}
int l=0;//用于给数组中存数
for(int j=1;j<=numsSize;j++)
{
    if(!hash[j])//如果等于0则证明没有出现过
    {
        ret[l++]=j;
    }
}
*returnSize=l;//必须告知数组的长度
return ret;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:41:41  更:2021-12-04 13:41:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/29 6:26:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码