代码随想录1.25

文章目录

    • 哈希表理论
    • 242. 有效的字母异位词
    • 349. 两个数组的交集
    • 202. 快乐数
    • 1. 两数之和

哈希表理论

什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

  1. 哈希表结构:数组,集合,映射
    数组就是简单的哈希表,但是数组的大小可不是无限开辟的
  2. 哈希函数
  3. 哈希碰撞(拉链法、线性探测法)

242. 有效的字母异位词

就是将字母映射到record数组中,数组的位置记录的是这个字母出现的次数
可以直接用.size()来判断数组和字符串的长度
s字符串出现一次给record位置+1,t出现一次给record位置-1,看最后record是不是全为0

349. 两个数组的交集

方法1:用数组来做哈希表
c++语法:

  1. for (int num : nums2) 由三个部分组成:
    int num:声明一个变量 num,它的类型与容器中元素的类型相同。每次迭代时,这个变量会保存容器中当前元素的值。
    ::这个冒号是关键,表示遍历 nums2 容器中的每个元素。
    nums2:表示要遍历的容器(在这里是 nums2)。每次循环,num 将被赋值为 nums2 中的一个元素。
  2. unordered_set result_set;定义一个set集合,result_set.insert(num);给这个集合添加值为num的元素。

方法2:用set来做哈希表
使用数组来做哈希的题目,是因为题目都限制了数值的大小。如果题目没有限制数值的大小,就无法使用数组来做哈希表了,就要使用set类型结构体:
std::set
std::multiset
std::unordered_set

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
        unordered_set<int> nums_set(nums1.begin(), nums1.end());
        for (int num : nums2) {
            // 发现nums2的元素 在nums_set里又出现过
            if (nums_set.find(num) != nums_set.end()) {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }
};

202. 快乐数

c++语法:

  1. 在set中寻找num元素:set.find(num)
  2. 给set添加num元素:set.insert(num)

思路就是判断每次的位平方和记录进set中,然后判断位平方和是否在set中出现,如果出现,就进入死循环返回false,如果位平方和=1,则返回true。每次循环的操作是,更新n=位平方和

1. 两数之和

这道题用哈希法,因为需要得到下标,所以用Map类型
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。
std::map 和std::multimap 的key也是有序的(这个问题经常作为面试题,考察对语言容器底层的理解)。

map中,第一个放元素值,第二个放对应的索引位置
c++语法:

  1. 新建map:std::unordered_map map;(第一个位置放的是数值,第二个位置放的是索引)
  2. 在map中寻找是否有num值:auto iter = map.find(num); (注意是auto类型)。如果找到该元素,则返回指向该元素的迭代器。如果没有找到,它返回一个指向 map 末尾的迭代器,即 map.end()。查询迭代器内元素的方法:iter ->second
  3. 给map添加值:map.insert(pair(nums[i], i));

ps:暴力搜索

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        for(int i = 0; i< nums.size(); i++)
        {
            for(int j = i+1;j<nums.size();j++)
            {
                if(nums[i]+nums[j]==target){
                    return {i, j}; 
                };
            };
        };
        return {};
    };
};

你可能感兴趣的:(代码随想录跟练记录,哈希算法,散列表,算法,数据结构,c++,力扣)