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;
}
};