代码随想录算法训练营第6天|哈希表 part1

哈希表基础

显著的用途:判断一个元素是否出现在一个集合内。
常见的哈希结构:数组、set、map
unordered_set、 unordered_map

242.有效的字母异位词

思路:由于字符串都是同一个类型的小写字母,故可以直接使用数组作为哈希结构
建立一个长度26即可的数组,遍历字符串,每出现一个字母,就将对应序号的数组元素+1(注意上限不是9),然后再遍历第二个字符串,-1操作

class Solution {
public:
    bool isAnagram(string s, string t) {
     int record[26] = {0};
     for(int i = 0; i<s.size(); i++){
         record[s[i] - 'a'] ++;
     }
     for(int j = 0; j<t.size(); j++){
         record[t[j] - 'a'] --;
    } for(int k = 0; k<26; k++){
        if(record[k] != 0){
            return false;
         }
    }return true;
    }
};

349. 两个数组的交集

本题由于不像上题可以限定数组的大小只需为26,所以要使用set;

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
          unordered_set<int> result_set;
          unordered_set<int> num_set(nums1.begin(),nums1.end());
          for(int num : nums2){
              if(num_set.find(num) != num_set.end()){
                  result_set.insert(num);
              }
          }
          return vector<int>(result_set.begin(), result_set.end());
    }
};				

注意查询是否存在元素的语句:if ( num_set.find (num) != num_set.end() )

1. 两数之和

思路:为了寻找到两数之和为目标值的两个数,可以先将一个数写入哈希表,读取下一个数num时,判断哈希表中是否存在taget-num,如果存在则已经找到这两个数,如果不存在,就将这个数也写入哈希表。
由于题目要求返回下标,所以需要存储一个元素值和对应的下标值,即需要键值对,所以采用map
unorderd_map<int,int> check_map;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> check;
        for(int i = 0; i <= nums.size(); i++){
            auto iter = check.find(target-nums[i]);
            if(iter != check.end()){
                return{iter->second,i};
            }check.insert(pair<int,int>(nums[i],i));
        }return {};
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值