LeetCode热题100题|1.两数之和,49.字母异位词分组

1.两数之和

题目链接:1. 两数之和 - 力扣(LeetCode) 

这道题的暴力解法应该就是依次遍历两个数,等于target就返回它们的下标

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        for (int i = 0; i < nums.size(); i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return {};//无解时返回空数组
    }
};

哈希表这种方法可以用空间换时间, 把元素设置为key,下标设置成value,一个key可以对应多个value,比如有数组【3,3,3,2】 target为5

3这个元素会有多个下标(0,1,2),收集结果想让他为【2,3】覆盖原下标的话就用map[nums[i]]=i;

如果不覆盖原下标就是我想收集结果是【0,3】不覆盖原下标的话就用map.insert({nums[i],i});

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

49.字母异位词分组

题目链接:49. 字母异位词分组 - 力扣(LeetCode)

天哪,感觉做这道题一层皮差点下来...

我觉得它的思路把每一个字母进行从小到大排序,相同的就放在一个map容器里面

然后比如我们就开始把键"abc"存在mp容器里面,里面就会放["cab","bca","cba"],emplace_back是vector数组进行调用的,如果发现该数在vector里面那就不加了,不在的话就会往里面添加。

for(string &str:strs){
        string key=str;
        sort(key.begin(),key.end());
        mp[key].emplace_back(str);
       }

 这样我们进行遍历每一个字符,就可以把相同的字符放在mp前面,不同的放在后面,像这样:

mp = {
    {"aet", ["eat", "tea", "ate"]},
    {"ant", ["tan", "nat"]}
}

然后我们收集结果ans,其实就是收集["eat", "tea", "ate"] ["tan", "nat"]可以用迭代器进行收集,下面是用迭代器的思路:

  1. it 指向 {"aet": ["eat", "tea", "ate"]}

  2. it->second 是 ["eat", "tea", "ate"]

  3. ans.emplace_back(it->second) → ans 变为 [ ["eat", "tea", "ate"] ]

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
       unordered_map<string,vector<string>> mp;
       for(string &str:strs){//在mp中存入结果
        string key=str;
        sort(key.begin(),key.end());
        mp[key].emplace_back(str);
       }
       vector<vector<string>> ans;//在ans中收集结果
       for(auto it:mp){
        ans.emplace_back(it.second);
       }
       return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值