Bootstrap

Leetcode 刷题 Day 7:454. 四数相加 II 383. 赎金信 15. 三数之和 18 四数之和

454 四数相加 II
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

class Solution(object):
    def fourSumCount(self, nums1, nums2, nums3, nums4):
        record = {} #key-value:和的值-和出现的次数
        for n1 in nums1:
            for n2 in nums2:
                if n1+n2 not in record:
                    record[n1+n2] = 1
                else:
                    record[n1+n2] += 1
        count = 0 #满足的元组的个数
        for n3 in nums3:
            for n4 in nums4:
                if 0-n3-n4 in record:
                    count += record[0-n3-n4]
        return count
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :type nums3: List[int]
        :type nums4: List[int]
        :rtype: int
        """

383 赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。

class Solution(object):
    def canConstruct(self, ransomNote, magazine):
        record = [0]*26
        for i in magazine:
            record[ord(i)-ord('a')] += 1
        for j in ransomNote:
            if record[ord(j)-ord('a')] == 0:
                return False
            else:
                record [ord(j)-ord('a')] -=1
        return True

        """
        :type ransomNote: str
        :type magazine: str
        :rtype: bool
        """
        #方法2
        # if len(ransomNote) > len(magazine):
        #     return False
        # data = set()  # 使用集合
        # for c in ransomNote:
        #     data.add(c)
        # for i in data:
        #     if magazine.count(i) < ransomNote.count(i):
        #         return False
        # return True

15 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组

class Solution(object):
    def threeSum(self, nums):
        res = []
        nums.sort()#sort的用法
        n = len(nums)
        for cur in range(n):
            if nums[cur] > 0:
                return res
            if cur >= 1 and nums[cur] == nums[cur-1]:
                continue
            left = cur+1
            right = n-1
            while left < right:
                
                if nums[cur] + nums[left] + nums[right] > 0:
                    right -= 1
                elif nums[cur] + nums[left] +nums[right] < 0:
                    left += 1
                else:
                    res.append([nums[cur],nums[left],nums[right]])
                    
                    while left < right and nums[left+1] == nums[left]:
                        left += 1
                    while left < right and nums[right-1] == nums[right]:
                        right -= 1
                    left += 1
                    right -= 1
        return res
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """

18 四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

class Solution(object):
    def fourSum(self, nums, target):
        res = []
        nums.sort()
        n = len(nums)
        for i in range(0,n):
            #给x去重
            if i >= 1 and nums[i] == nums[i-1]:
                continue
            for j in range(i+1,n):
                #给y去重
                if j > i+1 and nums[j] == nums[j-1]:
                    continue
                left = j + 1
                right = n - 1
                while left < right:
                    total = nums[i] + nums[j] + nums[left] + nums[right]
                    if total > target:
                        right -= 1
                    elif total < target:
                        left += 1
                    else:
                        res.append([nums[i],nums[j],nums[left],nums[right]])
                        while left < right and nums[left+1] == nums[left]:
                            left += 1
                        while left < right and nums[right-1] == nums[right]:
                            right -= 1
                        left += 1
                        right -= 1
        return res
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
;