1. 两数之和/49. 字母异位词分组

1. 两数之和

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

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

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

思路:暴力解法两层循环解决,这里利用map可以使得时间复杂度变小,用目标值减去当前的数组元素,得到需要的值,再去map中寻找,没有就将当前值加入(值作key,下标作value),找到就输出下标和map中对应的值。

注意:

·unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value。

·unordered_map存储元素时是没有顺序的,只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完成。


·unordered_map查询单个key的时候效率比map高,但是要查询某一范围内的key值时比map效率低。


·可以使用[]操作符来访问key值对应的value值。

代码:

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

49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

思路:字母异位词有一个相同的特点,他们组合的字母都一致,这就可以作为一个key,所以可以用排序来确定key。nat和tan的排序都是ant,ant就是key。遍历strs中的所有字符串,对每个字符串进行排序(先转成字符串数组再排序)得到key,再将字符串加入到map[key]中就得到一个整理好的map,最后输出即可。

代码:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
       //初始化map
       unordered_map<string,vector<string>> map;
       //循环处理每一个字符串,找到对应的key值
       for(string& str: strs){
            string key=str;
            //排序
            sort(key.begin(),key.end());
            //根据key值放入字符串
            map[key].emplace_back(str);
       }
       //输出整理好的map表
       vector<vector<string>> v;
       for(auto i=map.begin();i!=map.end();i++){
            v.emplace_back(i->second);
       }
       return v;
    }
};

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值