代码随想录刷题day6

242.有效的字母异位词

用数组实现哈希; 注意初始化;

int storage[26] = {0}; //定义数组的方法:  数据类型  数组名[数组长度]; 这时候index从 0 - 25;注意要初始化这个数组,不初始化会报错

349. 两个数组的交集

用unoderset来实现哈希,注意unorderset容器内部直接就做了去重操作

要注意的点:使用数组来做哈希的题目,是因为题目都限制了数值的大小。 而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费

范围for循环, c++11的新特性,专门给容器用的:for (int num : nums2);从nums2的int型数组中依次将值赋值给num,将num带入for语句代码块中执行。

等效于: int num; for(int i=0;i

  for (int num : nums2) {
            // 发现nums2的元素 在nums_set里又出现过
            if (nums_set.find(num) != nums_set.end()) {
                result_set.insert(num);
            }
        }

寻找比较这个需要理解: 如果找到了num, find函数就返回迭代器, 如果没找到就会返回num.set.end(), 因此这里的!= 相当于找到了。 c++ STL 需要再学习下

202. 快乐数

把sum的结果存在一个unorder的set里面, 其他的很好理解;

1. 两数之和

这道题以前用暴力法做过,代码如下:

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

这次使用哈希来做, 使用map结构,理由如下:

  • 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。

此时就要选择另一种数据结构:map , map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。要学习下map的各种使用方法;

return {iter->second, i};

上面语句解释如下:

(*it).first会得到key,

(*it).second会得到value。

你可能感兴趣的:(哈希算法,数据结构,散列表)