> 文档中心 > 《五月集训》第七天——哈希表

《五月集训》第七天——哈希表

目录

  • —、第一题
    • 1. 原题链接
    • 2. 解题思路
    • 3. 代码
  • 二、第二题
    • 1. 原题链接
    • 2. 解题思路
    • 3. 代码
  • 三、第三题
    • 1. 原题链接
    • 2. 解题思路
    • 3. 代码
  • 四、星球推荐

—、第一题

1. 原题链接

        原题链接:1512. 好数对的数目

        给你一个整数数组 nums 。

        如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。

        返回好数对的数目。

2. 解题思路

        建立hash在计数的同时,去查找相同值,根据相同值的数量进行累加,最后返回。

3. 代码

int numIdenticalPairs(int* nums, int numsSize){   int hash[101] = {0};   int flag = 0;   for(int i = 0; i < numsSize; ++i){++hash[nums[i]];flag += hash[nums[i]]-1;   }   return flag;}

二、第二题

1. 原题链接

        原题链接:2006. 差的绝对值为 K 的数对数目

        给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。

        |x| 的值定义为:

        如果 x >= 0 ,那么值为 x 。
        如果 x < 0 ,那么值为 -x 。

2. 解题思路

        1.哈希+滑动窗口,建立哈希计数,通过滑动窗口的左右值的数量,得到差值数量。
        2.哈希,判断当前值+k有无此值或-k有无此值,进行计数。

3. 代码

        哈希 + 滑动窗口 如下:

int countKDifference(int* nums, int numsSize, int k){   int hash[101] = {0};   int i;   int flag = 0 , max = 0, min = 101;for(i = 0; i < numsSize; ++i){    ++hash[nums[i]];    if(max < nums[i]) max = nums[i];    if(min > nums[i]) min = nums[i];}for(i = k+min ; i <= max; ++i){    flag += hash[i] * hash[i-k];}   return flag;  }

        哈希 如下:

int countKDifference(int* nums, int numsSize, int k){   int hash[101] = {0};   int i, dif;   int flag = 0;for(i = 0; i < numsSize; ++i){    dif = nums[i] + k;    if(dif >= 1 && dif <= 100) flag += hash[dif];    dif = nums[i] - k;    if(dif >= 1 && dif <= 100) flag += hash[dif];    ++hash[nums[i]];}   return flag;  }

三、第三题

1. 原题链接

        原题链接:1347. 制造字母异位词的最小步骤数

        给你两个长度相等的字符串 s 和 t。每一个步骤中,你可以选择将 t 中的 任一字符 替换为 另一个字符。

        返回使 t 成为 s 的字母异位词的最小步骤数。

        字母异位词 指字母相同,但排列不同(也可能相同)的字符串。

2. 解题思路

        建立字符串st的两个hash,并遍历字符串计数。然后两个hash同时遍历,当hasht的值大于hashs时表示t[i]字符需要更换hasht[i] - hashs[i]个,直至循环完毕返回。

3. 代码

int minSteps(char * s, char * t){   int hashs[26] = {0};   int hasht[26] = {0};   int i;   int ret = 0;   for(i = 0; s[i] != '\0'; ++i){++hashs[s[i]-'a'];++hasht[t[i]-'a'];   }   for(i = 0; i < 26; ++i){if(hashs[i] < hasht[i])    ret += hasht[i] - hashs[i];   }   return ret;}

四、星球推荐

        星球链接:英雄算法联盟

星球里有什么?
        【朋友圈】一个极致精准的自律、编程、算法的小圈子。
        【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
        【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
        【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
        【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
        目前星球人数达到320+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。