24.哀家要长脑子了!---哈希表

目录

1.594. 最长和谐子序列 - 力扣(LeetCode)

2.350. 两个数组的交集 II - 力扣(LeetCode)

3.554. 砖墙 - 力扣(LeetCode)

 4.9. 回文数 - 力扣(LeetCode)

 5.13. 罗马数字转整数 - 力扣(LeetCode)

6.58. 最后一个单词的长度 - 力扣(LeetCode)


1.594. 最长和谐子序列 - 力扣(LeetCode)

烦死了烦死了!!总是模模糊糊一知半解的感觉,然后感觉自己能做,搞半天又去看题解了,搞毛啊你。

 这个map中的索引key是num元素,val是这个num元素又多少个啊。

class Solution {
public:
    int findLHS(vector<int>& nums) {
        unordered_map<int, int> map;
        for(int num : nums){
            map[num]++;
        }
        int res = 0;
        for(auto [key,val] : map){
            if(map.count(key+1)){
                res = max(res, val + map[key+1]);
            }
        }
        return res;
    }
};
2.350. 两个数组的交集 II - 力扣(LeetCode)

这个题目有意思的地方就在于,它不仅仅只是交集元素出现,这个交集元素在答案它还要重复出现, 出现多少次呢,以出现次数少的那次为标准。

怎么做到的呢:首先以长度小的数组记录到map中。 然后就需要操作map中的val值了,找到一次num并且判断它在map中作为索引所对应的值不为0,就可以把它记录到答案中去,然后要减一。代表它出现的次数少一次了。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.size() > nums2.size()) return intersect(nums2, nums1);
        unordered_map<int, int> map;
        for(int num : nums1){
            map[num]++;
        }
        vector<int> res;
        for(int num : nums2){
            if(map.count(num) && map[num] != 0){
                res.push_back(num);
                --map[num];
            }
        }
        return res;
    }
};
3.554. 砖墙 - 力扣(LeetCode)

晕头转向 晕头转向哈哈哈 要不这堵墙撞死我吧

要找穿过砖块数量最少的等价于要找砖块边缘线穿过行数最多的。

我其实没有搞懂,我只能对着代码解释一下我自己的理解 ToT。

哈希表cnt中记录的是,在不同水平位置上的累计砖块宽度值出现的次数。这里的”累计砖块宽度值“指的是从墙最左边开始到某个点为止,所有砖块宽度的和 (但不包括最后一块砖的宽度,因为我们关心的是缝隙的位置),就是找缝隙。

以上图中的样例为准,一行一行遍历得出的map就是这样子的 意思就是,第1块砖后面有缝隙的有3行,第3块砖后面有缝隙的有2行,第5块砖后面有缝隙的有2行,以此类推....

把总的行数减去砖块行数被共享最多的缝隙数,就是可以跨过最少的砖块行数。

class Solution {
public:
    int leastBricks(vector<vector<int>>& wall) {
        unordered_map<int,int> cnt;
        for(auto &widths : wall){
            int n = widths.size();
            int sum = 0;
            for(int i = 0; i < n - 1; i++){
                sum += widths[i];
                cnt[sum]++;
            }
        }
        int maxCnt = 0;
        for(auto& [_, c] : cnt){
            maxCnt = max(maxCnt, c);
        }
        return wall.size() - maxCnt;
    }
};
 4.9. 回文数 - 力扣(LeetCode)

小姐姐吃完方便面和两个Q蒂还有辣条回来开始水题了 哈哈。。。。

nia,我都不好意思说出来,那行关键代码我没写出又死懒,直接看的答案。我服了妈妈

res = res * 10 + n % 10;

class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0) return false;
        long long n = x, res = 0;
        while(n){
            res = res * 10 + n % 10;
            n /= 10; 
        }
        if(res == x)
          return true;
        else
            return false;
    }
};
 5.13. 罗马数字转整数 - 力扣(LeetCode)

 

 是一道数学技巧题的感觉,当时感觉总是静不下心来,只想快点搞完走了,感觉是不是吃零食吃多了的原因,有点浮躁

其实就是用一个map把他们的映射关系存起来,罗马数字是索引,阿拉伯数字是值。然后判断一下左边的是不是比右边的小,如果是的话就把左边这个数字变为负的,嗯,就是酱紫,为什么你不会做。。。。。。。。

class Solution {
public:
    int romanToInt(string s) {
        unordered_map<char, int> map = {
            {'I', 1},
            {'V', 5},
            {'X', 10},
            {'L', 50},
            {'C', 100},
            {'D', 500},
            {'M', 1000}
        };
        int res = 0;
        for(int i = 0; i < s.size(); i++){
            if(i < s.size() - 1 && map[s[i]] < map[s[i+1]]){
                res -= map[s[i]]; 
            }
            else{
                res += map[s[i]];
            }
        }
        return res;
    }
};
6.58. 最后一个单词的长度 - 力扣(LeetCode)

是这样啊:要判断最后一个单词的长度,那就从字符串的末尾开始找噻。看样例可以发现最后一个单词后面还可能有空格,那就把指针先移动到不是空格的位置噻。

class Solution {
public:
    int lengthOfLastWord(string s) {
        int n = s.size() - 1;
        while(s[n] == ' '){
            n--;
        }
        int res = 0;
        while(n >= 0 && s[n] != ' '){
            n--, res++;
        }
        return res;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值