从零开始刷Leetcode——数组(532.561)

文章目录

  • 532. 数组中的K-diff数对
  • 561. 数组拆分 I

532. 数组中的K-diff数对

给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k.

1.哈希表

class Solution:
    def findPairs(self, nums: List[int], k: int) -> int:
        dict = {
     }
        count = 0
        for i in range(len(nums)):
            if nums[i] in dict:
                dict[nums[i]] += 1
            else:
                dict[nums[i]] = 1
        if k == 0:
            for j in dict:
                if dict[j]//2 > 0:
                    count += 1
        elif k < 0:
            return 0
        else:
            for index in dict:
                if index+k in dict:
                    count += 1
        return count

这题坑好多,k为负数要返回0.。。哈希表基本都一个套路,转换成字典再运算。148ms,15.2MB

2.利用集合的性质

class Solution:
    def findPairs(self, nums: List[int], k: int) -> int:
        if k < 0:
            return 0
        if k == 0:
            return len(set([i for i in nums if nums.count(i)>=2]))
        cl = [i+k for i in nums]
        return len(set(cl)&set(nums))

k为0时,返回列表中元素数量大于1的数的集合,k大于0时,用原列表的集合和原列表+k的集合进行与操作得到结果。164ms,16.1MB

3.依然是集合

class Solution:
    def findPairs(self, nums: List[int], k: int) -> int:
        if k < 0:
            return 0
         # s存储遍历的元素, r存储上面注释的3
        s, r = set(), set()
        for n in nums:
            if n + k in s:
                r.add(n + k)
            if n - k in s:
                r.add(n)
            s.add(n)
        
        return len(r)

比较直接了,一个集合存所有不重复的值,一个存符合条件的值。144ms,15.7MB

561. 数组拆分 I

给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。

1.排序

class Solution:
    def arrayPairSum(self, nums: List[int]) -> int:
        nums.sort()
        return sum(nums[::2])

388ms,16.3MB

你可能感兴趣的:(leetcode,leetcode)