代码随想录算法训练营第六天

242. 有效的字母异位词

哈希表的数组实现

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        result = [0]*26
        for i in s:
            result[ord(i)-ord('a')]+=1
        for i in t:
            result[ord(i)-ord('a')]-=1
        for i in result:
            if i!=0:
                return False
        return True

ord():计算字符的哈希值

采用相对数值的方式,只需要建立长度为26的数组即可,初始值都赋为0(对于长度较小的情况一般采用数组的形式构建哈希表)

349. 两个数组的交集

出现唯一值,一般考虑集合

集合常用操作:

1、集合的创建:

s = {1, 2, 3, 4, 5}  # 使用花括号直接创建  
s = set([1, 2, 3, 4, 5])  # 使用set()函数从列表或其他可迭代对象创建

2、添加元素:

s.add(6)  # 添加单个元素  
s.update([7, 8, 9])  # 添加多个元素,可以是列表、元组等可迭代对象

3、移除元素

s.remove(5)  # 移除指定元素,如果元素不存在则抛出KeyError异常  
s.discard(6)  # 移除指定元素,如果元素不存在则不抛出异常  
s.pop()  # 随机移除一个元素并返回它,如果集合为空则抛出KeyError异常  
s.clear()  # 移除集合中的所有元素

4、集合的交集并集差集

s1 = {1, 2, 3, 4, 5}  
s2 = {4, 5, 6, 7, 8}  
intersection = s1 & s2  # 或 s1.intersection(s2)
union = s1 | s2  # 或 s1.union(s2)
diff = s1 - s2  # s1中有但s2中没有的元素  
diff_reverse = s2 - s1  # s2中有但s1中没有的元素
symmetric_diff = s1 ^ s2  # s1或s2中有,但不同时存在的元素

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list(set(nums1)&set(nums2))


    def intersect1(self, nums1: List[int], nums2: List[int]) -> List[int]:
        a = [0]*1001
        b = [0]*1001
        c = []
        for i in range(len(nums1)):
            a[nums1[i]]+=1
        for i in range(len(nums2)):
            b[nums2[i]]+=1
        for i in range(1001):
            if a[i]*b[i]>0:
               c.append(i) 
        return c  

        扩展:350. 两个数组的交集 II:返回全部重复的元素(不去重)

class Solution:
##双指针
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1.sort()
        nums2.sort()
        result = []
        a = b = 0
        while a < len(nums1) and b < len(nums2):
            if nums1[a] < nums2[b]:
                a+=1
            elif nums1[a] > nums2[b]:
                b+=1
            else:
                result.append(nums1[a])
                a+=1
                b+=1
        return result

##三个数组
    def intersect1(self, nums1: List[int], nums2: List[int]) -> List[int]:
        a = [0]*1001
        b = [0]*1001
        c = []
        for i in range(len(nums1)):
            a[nums1[i]]+=1
        for i in range(len(nums2)):
            b[nums2[i]]+=1
        for i in range(1001):
            if a[i]*b[i]>0:
                for _ in range(min(a[i], b[i])):  
                    c.append(i) 
        return c   

1. 两数之和

class Solution:

##暴力解法双循环
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(0,len(nums)):
            for j in range(i+1,len(nums)):
                if nums[j] == target-nums[i]:
                    return [i,j]

##集合
    def twoSum1(self, nums: List[int], target: int) -> List[int]:
        a = set()
        for i,num in enumerate(nums):
            b = target-num
            if b in a:
                return [nums.index(b),i]
            a.add(num)

##字典
    def twoSum2(self, nums: List[int], target: int) -> List[int]:
        a = dict()
        for i,num in enumerate(nums):
            b = target-num
            if b in a:
                return [nums.index(b),i]
            a[num] = b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值