HOT100打卡—day1—【哈希】

​​​​​​1. 两数之和

 以前做过的hash。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        unordered_set<int> set;
        map<int,int> map;
        for(int i = 0; i < nums.size();i++)
        {
            set.insert(nums[i]);
            map[nums[i]] = i;
        }
        vector<int> output;
        for(int i = 0;i < nums.size();i++)
        {
            if(set.find(target - nums[i]) != set.end())  //找到了
            { //  如果是  map[3] = 1 map[3] =  2  估计find的时候会先找到 
                if(map[target - nums[i]] == i)continue;  //不能自己和自己加
                output.push_back(i);
                output.push_back(map[(target-nums[i])]);
                break;
            }
        }
        return output;
    }
};

​​​​​​49. 字母异位词分组

用multimap的哈希思想。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> ans;

        bool vis[strs.size()+2];
        memset(vis, 0, sizeof(vis));// 可以初始化一个全为true的数组

        multiset<int> a[strs.size()+2];  //重点用一下multiset,不去重,且有序!

        //预处理
        for(int i = 0; i < strs.size();i++)
            for(int j = 0; j < strs[i].size();j++)
                a[i].insert(strs[i][j] - 'a');


        //找结果
        for(int i = 0; i < strs.size();i++)
        {
            if(!vis[i])
            {
                vector<string> unit;

                vis[i] = 1;
                unit.push_back(strs[i]);
                
                for(int j = i+1;j < strs.size();j++)
                {
                    if(a[i] == a[j])
                    {
                        vis[j] = 1;
                        unit.push_back(strs[j]);
                    }
                }
                ans.push_back(unit);
            }
        }

        return ans;
    }
};

​​​​​​128. 最长连续序列

 考虑[0,1,2,0]的答案为3,即需要去重==.》用set。

sort 复杂度=====》(O(nlogn)),+遍历 不符合题目要求,但也过了。

class Solution {
public:
    int longestConsecutive(vector<int>& nums) 
    {
        // 去重且sort一遍(logn)+遍历一遍
        set<int> set1;
        for(int i =0; i < nums.size() ;i++)
            set1.insert(nums[i]);

        vector<int> tmp;
        for(int x : set1)
            tmp.push_back(x);

        sort(tmp.begin(),tmp.end());
        int tp = 0;
        int max_tp = 0;
        for(int i =0; i < tmp.size() ;i++)
        {
            if(i == 0)tp++;
            if(i > 0 && tmp[i-1]+ 1 == tmp[i] )tp++;
            else if(i > 0 && tmp[i-1]+ 1 != tmp[i] )
            {
                tp = 1;
            }
            if(tp > max_tp)max_tp = tp;
        }
        return max_tp;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值