代码随想录算法训练营第六天|哈希表part1|242有效的字母异同位、349两个数组的交集、202快乐数、1两数之和

leetcode242.有效的字母异同位

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

看了解析后作如下改进:

在定义数组时可以同时初始化,给所有元素赋同一个值只要这么一个语句就行

int a[26] = {0};

对于bool类型,最后的返回值可以是false或true

return false;
//return true;

leetcode349.两个数组的交集

·上一题因为数值限制在小于等于26,所以可以用数组来做哈希表,如果这道题目没有限制数值的大小,就无法用数组来做哈希表。

此时就用到另一种结构体:set,c++提供了三种可用的数据结构:

  • std::set
  • std::multiset
  • std::unordered_set

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;
        unordered_set<int> nums_set(nums1.begin(), nums1.end()); // 将nums1中的元素放入到集合中,并且在集合中已经去重了
        for(int num : nums2){ // 遍历nums2中所有元素
            if(nums_set.find(num) != nums_set.end()){ // 检查nums2中的元素是否在nums_set中。如果在,find返回该元素的迭代器(和指针类似),nums_set.end()指向的是集合最后一个元素后面的位置,相当于指针里面的null
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end()); // 将集合转换为数组
    }
};

leetcode202.快乐数

计算平方和可以单独写一个函数

class Solution {
public:
    int getsum(int n){
        int sum = 0;
        while(n){
            sum += (n % 10) * (n % 10); // 取模
            n /= 10; // 取整,从个位开始
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> sum_set;
        int sum = getsum(n);
        sum_set.insert(sum);
        while(sum != 1){
            sum = getsum(sum);
            if(sum_set.find(sum) != sum_set.end()){
                return false;
            }
            sum_set.insert(sum);
        }
        return true;
    }
};

leetcode1.两数之和

用multiset没写出来,看解析后知道应该用map

c++中的map也有三种类型:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map <int,int> map;
        for(int i = 0; i < nums.size(); i++) {
            // 遍历当前元素,并在map中寻找是否有匹配的key
            auto iter = map.find(target - nums[i]); 
            if(iter != map.end()) {
                return {iter->second, i};
            }
            // 如果没找到匹配对,就把访问过的元素和下标加入到map中
            map.insert(pair<int, int>(nums[i], i)); 
        }
        return {};
    }
};

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值