代码随想录算法训练营第5天|242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

代码随想录算法训练营第5天|242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242. 有效的字母异位词

题目链接

提交代码(哈希表,用长度26的数组保存每个字母出现次数)

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

解答代码(方法1-排序)

class Solution {
    
    
public:
    bool isAnagram(string s, string t) {
    
    
        if (s.length() != t.length()) {
    
    
            return false;
        }
        sort(s.begin(), s.end());
        sort(t.begin(), t.end());
        return s == t;
    }
};

解答代码(方法2-哈希表)

class Solution {
    
    
public:
    bool isAnagram(string s, string t) {
    
    
        if (s.length() != t.length()) {
    
    
            return false;
        }
        vector<int> table(26, 0);
        for (auto& ch: s) {
    
    
            table[ch - 'a']++;
        }
        for (auto& ch: t) {
    
    
            table[ch - 'a']--;
            if (table[ch - 'a'] < 0) {
    
    
                return false;
            }
        }
        return true;
    }
};

349. 两个数组的交集

题目链接

提交代码(方法)

class Solution {
    
    
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    
    
         unordered_set<int> set;
         unordered_set<int> result;
         for(int i = 0; i < nums1.size(); i++)
         {
    
    
            if(set.count(nums1[i]) == 0)
                set.insert(nums1[i]);
         }
         for(int i = 0; i < nums2.size(); i++)
         {
    
    
             if(set.find(nums2[i]) != set.end())
                result.insert(nums2[i]);
         }
         return vector<int>(result.begin(), result.end());
    }
};

解答代码(方法)

class Solution {
    
    
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    
    
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        int length1 = nums1.size(), length2 = nums2.size();
        int index1 = 0, index2 = 0;
        vector<int> intersection;
        while (index1 < length1 && index2 < length2) {
    
    
            int num1 = nums1[index1], num2 = nums2[index2];
            if (num1 == num2) {
    
    
                // 保证加入元素的唯一性
                if (!intersection.size() || num1 != intersection.back()) {
    
    
                    intersection.push_back(num1);
                }
                index1++;
                index2++;
            } else if (num1 < num2) {
    
    
                index1++;
            } else {
    
    
                index2++;
            }
        }
        return intersection;
    }
};

202. 快乐数

题目链接

提交代码(方法)

class Solution {
    
    
public:
    bool isHappy(int n) {
    
    
        unordered_set<int> set;
        while(true)
        {
    
    
            int curRes = 0;
            while(n > 0)
            {
    
    
                int bit = n % 10;
                n = n / 10;
                curRes += bit * bit;
            }
            if(curRes == 1)
                return true;
            if(set.count(curRes))
                break;
            n = curRes;
            set.insert(curRes);
        }
        return false;
    }
};

解答代码(方法)

在这里插入代码片

1. 两数之和

题目链接

提交代码(方法)

class Solution {
    
    
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    
    
        unordered_map<int, int> map;
        for (int i = 0; i < nums.size(); i++) {
    
    
            auto it = map.find(target - nums[i]);
            if (it != map.end()) {
    
    
                return {
    
    it->second, i};
            }
            map[nums[i]] = i;
        }
        return {
    
    };
    }
};

解答代码(方法)

class Solution {
    
    
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    
    
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i) {
    
    
            auto it = hashtable.find(target - nums[i]);
            if (it != hashtable.end()) {
    
    
                return {
    
    it->second, i};
            }
            hashtable[nums[i]] = i;
        }
        return {
    
    };
    }
};

总结

                     日期: 2023 年 3 月 20 日
              学习时长: 1 h 30 m
                     难度: ★ \bigstar
累计完成题目数量: 16
距离目标还有数量: 284
                      小结:

  1. 对于哈希表,解答中的方法在最开始判断两个字符串长度是否相等,如果不相等则直接为false,这个我没有判断。同时,在字符串长度相等的前提下,如果第二次有出现 <0 的情况直接返回false就可以了。
  2. 关于第二个问题,unordered_set是具有唯一性的,也就是插入两个相同元素的时候,返回的count值是1,而不是2。可以使用find()函数与end()做比较来判断元素是否出现过。
  3. 关于第三个问题,三个方法只看了第一种方法,利用哈希表,剩下的方法今天先不看了,总的来说就是,要么陷入循环,要么得到1。

猜你喜欢

转载自blog.csdn.net/qq_43212651/article/details/129675126