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-1000 因此可以选择数组 不过 用集合更符合这种大范围数据的要求
- 用集合存储结果 目的是 保证元素不重复
- 注意 第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);
本文来自博客园,作者:跬步瑶,转载请注明原文链接:https://www.cnblogs.com/deservee/p/16870346.html

浙公网安备 33010602011771号