day13

[0349.两个数组的交集]

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result (1000 , 0);
        int k = 0;
        for (int i = 0; i <= nums1.size(); i++){
            for (int j = 0; j <= nums2.size(); j++){
                if (nums1[i] == nums2[j]){
                    result[k] = nums1[i];
                    k++;
                    break;
                }
            }
        }
        return result;
    }
};
  • 因为这部分是哈希题目么 本来想的是用哈希链表 就是先把nums1中的每个元素存在竖起来的链表里 然后把nums2里的元素 接在nums1相同数值的后面 这样 相同数组元素 就是nums1结点后面不为空的那些结点存放的元素值 但是卡哥说可以暴力解 因为前面我的那个思路 那个数据结构实现起来还挺不简单的感觉 因为我没实现过 感觉会将题目复杂化 所以看到暴力解 我就去试了下 结果 没运行成功
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;
        unordered_set<int> nums1_set(nums1.begin() , nums1.end());
        for(int num : nums2){
            if(nums1_set.find(num) != nums1_set.end()){
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin() , result_set.end());
    }
};
  • unordered_set数据类型 之前没接触过 现在完全不会用

  • 首先 定义一个名为result_set 存放int类型的 unordered_set集合 unordered_set<int> = result_set;

  • 其次 把一个名为nums的整形数组 转换成 名为nums_set的unordered_set集合 unordered_set<int> nums_set(nums.begin() , nums.end());

  • 接着 对名为nums_set 的unordered_set集合类型的常见操作

    • nums_set.find(value);
    • nums_set.end();
    • nums_set.insert(value);
  • 最后 把unordered_set类型 转换成 vector类型 作为函数的返回值 retur vextor<int>(result_Set.begin() , result_set.end());

  • 此外 for(int num : nums2)的解释是 等价于

    int num;
    for(int i=0;i<nums.length;i++)
    {
    num=nums2[i];
    }
    
  • 综上 由于对这个容器不熟悉 所以。。。。 之后再多做几遍吧

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> hash(1000 , 0);
        vector<int> hash2(1000 , 0);
        int n = 0;
        for(int i = 0; i <= nums1.size(); i++){
            if(hash[nums1[i]] == 0){
                hash[nums1[i]]++;
                n++;
            }
        }
        vector<int> result(n , 0);
        for(int i = 0; i <= nums2.size(); i++){
            if(hash[nums2[i]] == 0)
                hash2[nums2[i]]++;
        }
        int j = 0;
        for(int i = 0; i <= 1000; i++){
            if(hash[i] == hash2[i]){
                result[j] = i;
                j++;
            }
        }
        return result;
    }
};
  • 题目 限制了范围是1000以内 那么用数组可以 我就又 强行 写了一遍 运行结果还是什么堆溢出
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;
        int hash[1005] = {0};
        for (int num : nums1) {
            hash[num] = 1;
        }
        for (int num : nums2) {
            if(hash[num] == 1){
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin() , result_set.end());
    }
};
  • 使用 数组 但是 和我想的区别在哪呢 我的想法是和之前 判断是否是字母异位词的方法一样 第一个串 经过hash映射 hash表对应位置++ 第二个串 经过映射 对应位置-- 那么最后判断hash表每个元素 都还是0的话 那么就两个是字母异位词
  • 可是 本题 不一样 首先 不是判断是否相同 而是要返回相同元素 其次 除了数组 还用了集合定义 那么本题 采用其中一个串映射到hash表上之后 另一个不需要映射 直接 取另一个串中的元素 判断hash表中该元素位置上是否已经被第一个串赋值为1 是的话就存入结果集合中
  • 注意注意!!!!
    1. 本题两个数组 一个用来映射成哈希表 一个用来在哈希表上查找
    2. 哈希表的数据结构 选择数组还是集合 主要看待映射元素范围是否可控 因为本题给出范围是1-1000 因此可以选择数组 不过 用集合更符合这种大范围数据的要求
    3. 用集合存储结果 目的是 保证元素不重复
    4. 注意 第2.点 和第3.点 哈希表的数据结构选择unordered_set类型 与 存储结果的变量的数据结构选择unordered_set类型 互不相关 各有原因

[0202.快乐数]

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> set;
        while(1) {
            int sum = getSum(n);
            if (sum == 1) {
                return true;
            }
            if (set.find(sum) != set.end()) {
                return false;
            } else{
                set.insert(sum);
            }
            n = sum;
        }
    }
};
  • 没想到 想不到 不知道对数字各位上取平方求和 怎么操作 也没想到用集合 就算知道 “sum重复即陷入循环 那么永远也不可能成为快乐数” 的意思等价于 不能出现重复元素 也想不到 “不能出现集合元素 那我就用集合来存储每一次求sum的结果 当set.find(sum) != set.end())意思就是集合中有这个元素 那么就不能向集合再插入sum 以及 再继续往下求sum了 该返回false了 当sum == 1 返回true 其余时候就是 set.insert(sum);
posted @ 2022-11-08 17:02  跬步瑶  阅读(33)  评论(0)    收藏  举报