10.27日打卡 594. 最长和谐子序列 350. 两个数组的交集 II

594. 最长和谐子序列

在这里插入图片描述

解法

第一种枚举法

在这里插入图片描述

第二种

在这里插入图片描述

python

class Solution(object):
    def findLHS(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        
            #给数组排序
            nums.sort()
            #res,最长和谐子序列
            begin,res=0,0
            #begin是第一个连续相同元素子序列的第一个元素,end指向第二个连续相同元素的子序列的末尾元素
            for end in range(len(nums)):
                while nums[end]-nums[begin]>1:
                    begin+=1
                if nums[end]-nums[begin]==1:
                #很精妙啊,这里
                    res=max(res,end-begin+1)
            return res

c++

class Solution {
public:
    int findLHS(vector<int>& nums) {
         unordered_map<int,int> hash;
         //记录i出现的次数,完成hash表
         for (int i : nums){
                hash[i]++;}
        int res =0;
        //和谐子序列的长度等于 xxx 和 x+1x + 1x+1 出现的次数之和。
        for(auto [key,val]:hash){
        //如果key+1的键值出现
            if(cnt.count(key+1)){
                res=max(res,val+cnt[key+1]);
            }
        }
        return res;


350. 两个数组的交集 II

在这里插入图片描述
在这里插入图片描述

解法

在这里插入图片描述

python

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:

        #self.intersect 方法的目的是计算这两个数组的交集
        if len(nums1)>len(nums2):
            return self.intersect(nums2,nums1)
        #nums1变成了更短的数组:为了降低空间复杂度,首先遍历较短的数组并在哈希表中记录每个数字以及对应出现的次数,然后遍历较长的数组得到交集。
        #collections.Counter是Python标准库中的一个类,它用于计数可哈希对象的出现次数
        m=collections.Counter()
        #m是哈希表,num键,统计次数
        for num in nums1:
            m[num]+=1
        intersection=[]
        #m.get(num, 0): 如果键 num 存在,它会返回与该键关联的值,否则返回默认值 0。
        for num in nums2:
            if (count :=m.get(num,0))>0:
                #如果在哈希表中存在这个数字,则将该数字添加到答案
                intersection.append(num)
                #并减少哈希表中该数字出现的次数。
                m[num]-=1
                if m[num]==0:
                    m.pop(num)
        return intersection

c++

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        //创建两个hash表
        unordered_map<int,int> hash1;
        unordered_map<int,int> hash2;
        //创建一个数组
        std::vector<int> vec;
        //完成两个hash统计表
        for (int i:nums1){
            hash1[i]++;
        }
        for (int i:nums2){
            hash2[i]++;
        }
        //统计出现的key次数很多的
        for(auto [key,val]:hash1){
             if (hash2.count(key)){
                 int a=min(hash1[key],hash2[key]);
                 for(int c=0;c<a;++c){
                 vec.emplace_back(key);}
             }

        }
        return vec;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值