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

242.有效的字母异位词

我的版本

想到直接使用哈希表记录字幕出现的数量

class Solution {
 public:
	bool isAnagram(string s, string t) {
		unordered_map map;
		for (auto c : s)
			map[c]++;
		for (auto c : t) {
			map[c]--;
		}
		for(auto element:map){
			if(element.second != 0)
				return false;
		}
		return true;
	}
};

代码随想录

代码随想录 (programmercarl.com)

因为字母只有26个,所以可以直接使用一个数组,存储各个字母出现的次数,更加省时间空间

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            record[s[i] - 'a']++;
        }
        for (int i = 0; i < t.size(); i++) {
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) {
                // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了		字符。
                return false;
            }
        }
        // record数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
};

349. 两个数组的交集

我的版本

关键点是要保证结果中不能有重复的数字

我选择使用一个map记录结果中输出的数量,防止重复

注意:if (map.find(num) != map.end() && map[num] == 0)这一句中不能把map[num] == 0放在前面,防止访问到不存在的出错。

class Solution {
 public:
	vector intersection(vector &nums1, vector &nums2) {
		unordered_map map;
		vector res;
		for (auto num : nums1)
			map[num] = 0;
		for (auto num : nums2) {
			if (map.find(num) != map.end() && map[num] == 0){
				res.emplace_back(num);
				map[num]++;
			}
		}
		return res;
	}
};

代码随想录

代码随想录 (programmercarl.com)

也可以选择这种方法:使用unordered_set的特性:每种东西只留一个

使用两个set过滤两个数组,最后得到的肯定没有重复的数字

class Solution {
public:
    vector intersection(vector& nums1, vector& nums2) {
        unordered_set result_set; // 存放结果,之所以用set是为了给结果集去重
        unordered_set 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(result_set.begin(), result_set.end());
    }
};

202. 快乐数

我的版本

这个还是有点技巧的:

  • 确定如何取这个数字的各个位数
  • 在while循环中,sum,n等变量的更新位置,return的条件
class Solution {
 public:
	bool isHappy(int n) {
		unordered_set set;

		while (true) {
      //注意sum要在这里更新为0
			long sum = 0;
			while (n != 0) {
				sum += (n % 10) * (n % 10);
				n /= 10;
			}
      
			n = sum;
      
			if (sum == 1)return true;//如果1,快乐就完事了
			if (set.find(n) != set.end()) {
        //不是1就去找这个sum之前出现过没有,有的话进入循环直接退出
				return false;
			} else {
        //没有的话,存放新得到的sum
				set.emplace(n);
			}
		}
	}
};

代码随想录

代码随想录 (programmercarl.com)

类似我的,只不过是把求sum封装起来

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 set;
        while(1) {
            int sum = getSum(n);
            if (sum == 1) {
                return true;
            }
            // 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
            if (set.find(sum) != set.end()) {
                return false;
            } else {
                set.insert(sum);
            }
            n = sum;
        }
    }
};

两数之和

我的版本

就使用map,存放当前这一位数值的 索引 和 需要凑的数(target-nums[i]),然后就找当前数map中是否有:

关键点:

  • 注意在遍历中,map插入和检索操作的顺序,要先查,在找
class Solution {
 public:
	vector twoSum(vector &nums, int target) {
		unordered_mapmap;
		for (int i = 0; i < nums.size(); ++i) {
			//要注意map查找 要在 map插入这一步的前面,注意注意
			if(map.find(nums[i])!=map.end())
				return {i,map.find(nums[i])->second};
			map[target - nums[i]] = i;
		}
		return {};
	}
};

代码随想录

代码随想录 (programmercarl.com)

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        std::unordered_map  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(nums[i], i)); 
        }
        return {};
    }
};

day6结束

你可能感兴趣的:(代码随想录算法训练营,算法,数据结构,leetcode,c++)