力扣49、128题

49. 字母异位词分组

  • 字母异位词:由相同的字母重新排列组合而成的不同单词
  • 思路:相同字母组成的单词,将这个单词的各字母,按照ASICII编码顺序重新排列组合,应该能够获得相同的序列
  • 算法实现
    1. 通过sort对单词进行排序:key = sort(str.begin(), str.end());
    2. 通过哈希表存储:key为排序后的序列,value为多个不同的单词,map[key].push_back(str);
    3. 数据结构如图所示
      在这里插入图片描述
  • 代码实现
vector<vector<string>> groupAnagrams(vector<string>& strs) {
        map<string, vector<string>> mp;
        for (int i = 0; i < strs.size(); i++) {
            string key = strs.at(i);
            sort(key.begin(), key.end());
            mp[key].emplace_back(strs.at(i));
        }
        vector<vector<string>> result;
        for (auto it = mp.begin(); it != mp.end(); ++it) {
            result.push_back(it->second);
        }
        return result;
    }

128. 最长连续序列

  • 最长连续序列:nums = [100,4,200,1,3,2]的最长连续序列为[1,2,3,4],长度为4
  • 思路:如果序列中的一个数,存在它的连续序列,则进入循环,不存在则不进入,从而减少循环次数
  • 算法实现
    1. 首先需要确保当前数字x在序列中没有前驱数字x-1,因为如果存在x-1,则在x-1的时候,当前数字x已经被统计过
    2. 找到每一个没有前驱数字的数,统计她的序列长度
  • 代码实现
int longestConsecutive(vector<int>& nums) {
	set<int> nums_set;
	// 去重
	for (int i = 0; i < nums.size(); i++) {
	    nums_set.insert(nums.at(i));
	}
	int max = 0;
	for (const int& num : nums_set) {
	    // 没有前驱数字
	    if (!nums_set.count(num - 1)) {
	        int current = num;
	        int count = 1;
	        while (nums_set.count(current + 1)) {
	            current += 1;
	            count += 1;
	        }
	        max = max > count ? max : count;
	    }
	}
	return max;
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值