leetcode 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

思路:

用数组实现哈希表

我们可以定义一个大小为26的数组arr(题目说只包含小写字母),先遍历字符串s,将字符串s里的每个字符出现的次数用数组arr记录一下,然后我们再遍历一遍字符串t,将字符串t中出现的字符出现的次数从数组arr中减去,最后判断数组arr是否全为0,如果全为0,则字符串s和字符串t是有效的字母异位词,否则不是。

时间复杂度:

O(n)

代码:
class Solution {
public:
    bool isAnagram(string s, string t) {
        int arr[26]={0};
        for(int i = 0;i

349. 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

思路:

哈希表用到的数据结构是unordered_setmyset存放的元素是不可重复的。

我们可以定义两个unordered_setset用来存放其中一个数组的元素,unorder_setresult用来存放结果。(这里用set来存放结果而不是用vector来存放的原因是set可以用来去重。)

用另一个数组里的所有元素分别来与myset进行查找,如果在myset里有这个元素,我们把它放到结果集result里。

时间复杂度:

O(mn)

代码:
class Solution {
public:
    vector intersection(vector& nums1, vector& nums2) {
        unordered_set set;
        unordered_set ret(nums2.begin(),nums2.end());
        for(int num:nums1)
        {
            if(ret.find(num)!=ret.end())
            {
                set.insert(num);
               // result.push_back(num);
            }
        }
        return vector(set.begin(),set.end());
    }
};

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

思路:

哈希表用到的数据结构是unordered_set myset中的数字不重复

首先,处理n的各个位上的数字的平方的和,我们可以编写一个函数int recount()实现求n的各个位的平方的和。

其次我们可以写一个while循环,将n带入recount()函数,用一个整型变量sum接收,判断sum是否等于1,如果是,则return true; 否则将sum插入到myset中去,令n = sum,再次进行上述操作。再操作过程中可能会出现sum的值再myset里出现过,这说明这个数字n再函数recount()中出现了数字的循环,说明这个数字n不是快乐数,return false即可。

时间复杂度:

O(logn)

代码:
class Solution {
public:
    int recount(int n)
    {
        int sum = 0;
        while(n)
        {
            sum +=   (n%10) * (n%10);
            n = n/10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set set;
        while(1)
        {
            int sum = recount(n);
            if(set.find(sum)!=set.end())
            {
                return false;
            }
            else if(sum==1)
            {
                return true;
            }
            else
            {
                set.insert(sum);
            }
            n = sum;
        }
    }
};

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

思路:

哈希表用unordered_map mymap中存放的元素不重复,有value值和key值。

本题涉及到根据数组本身的值返回数组的下标,所以我们考虑用map。

我们可以用一个for循环遍历数组中的元素,用 auto iter = map.find(target-nums[i]);,判断map中是否有iter这个值,如果有则返回{iter.second,i},否则将{nums[i],i}插入到map中。

时间复杂度:

O(n)

代码:
class Solution {
public:
    vector twoSum(vector& nums, int target) {
       unordered_map map;
       for(int i = 0;isecond,i};
           }
           else
           {
               map.insert(pair(nums[i],i));
           }
       } 
       return {};
    }
};

还有很多瑕疵,还需继续坚持!

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