(第8天)【leetcode题解】242、有效的字母异位词 349、 两个数组的交集

文章介绍了如何使用两种方法判断两个字符串是否为字母异位词,以及如何找出两个数组的交集。第一种方法是排序后比较,第二种是利用哈希表记录字符频率。同时,讨论了不同方法的时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

242、有效的字母异位词

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

思路一

s和t是异位词 <==> s和t排序后相等
因此,先把s和t排序,之后比较即可

代码

class Solution {
public:
    bool isAnagram(string s, string t) {
    	//排序
        sort(s.begin(), s.end());
        sort(t.begin(), t.end());
        //比较并返回结果
        return s == t;
    }
};

时间复杂度:O(nlogn);排序的时间复杂度为O(nlogn)、比较字符串是否相等的时间复杂度为O(n),总体的时间复杂度为O(nlogn)。
空间复杂度:O(logn);排序需要O(logn)的空间复杂度。

思路二

使用哈希表,记录s中每个字母出现的频次。
然后遍历t,不断地减去已经记录好的频次。
最后遍历哈希表,如果其中有不为0的元素,则表示s和t不是异位词。

代码

class Solution {
public:
    bool isAnagram(string s, string t) {
        int array[26] = {0};//定义一个数组记录字符串中字母出现的频次

        //遍历字符串s
        for (int i = 0; i < s.size(); i++) {
            array[s[i]-'a']++;//记录相应字母的出现频次
        }

        //遍历字符串t
        for (int i = 0; i < t.size(); i++) {
            array[t[i]-'a']--;
        }

        //遍历数组,判断数组中元素是否全是0
        for (int i = 0; i < 26; i++) {
            if (array[i] != 0) {
                return false;
            }
        }
        return true;
    }
};

时间复杂度:O(n);遍历哈希表需要的时间复杂度为O(n);
空间复杂度:O(1);空间固定需要长度为26的数组。

两个思路的优化

如果s的长度和t的长度不相等,那么这两个字符串一定不是异位词。
针对这样的特殊情况,先进行长度判断可以有效提高效率。

代码

if (s.length() != t.length()) {
	return false;}

349、两个数组的交集

题目描述

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

思路

分析题意:结果中每个元素是唯一的无序的
可以用哈希表来存储结果,注意本题的结果数量是不固定的,因此不能用固定空间都数组做哈希表;
这里选择用unordered_set来存储结果。

暴力法

代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        int n1 = nums1.size(), n2 = nums2.size();
        for (int i = 0; i < n1; i++) {//遍历nums1
            for (int j = 0; j < n2; j++) {//对于每个nums1的元素,遍历nums2
                //如果找到两数组中元素相等且该元素不在结果集中时,把该元素加入结果集
                if (nums1[i] == nums2[j] && find(res.begin(), res.end(), nums1[i]) == res.end()) {
                    res.push_back(nums1[i]);
                }
            }
        }
        return res;
    }
};

时间复杂度:O(mn);m表示nums1的长度,n表示nums2的长度。
空间复杂度:O(n);存储结果的容器最多存储两个数组中最短长度数组的元素。

哈希表法

本解法中用unordered_set来给结果去重,达成结果元素唯一性的题目要求。
代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> res;//用来存放结果,同时可以给结果去重
        unordered_set<int> nums_set(nums1.begin(),nums1.end());//把nums1转换成set,方便对元素的查找
        //遍历nums2中的所有元素
        for (int num : nums2) {
            //从nums_set中搜索num,若找到,则说明num是nums1和nums2的交集
            if (nums_set.find(num) != nums_set.end()) {
                res.insert(num);//将num存入res中
            }
        }
        return vector<int>(res.begin(),res.end());//把结果集转换成vector并返回
    }
};

时间复杂度:O(n+m);n为遍历nums2,m为把结果集转换成vector。
空间复杂度:O(n);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值