【LeetCode】day6

16. 最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

思路:和三数之和相似 注意返回的是最接近的和

class Solution:
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums.sort()
        mindiff = abs(nums[0] + nums[1] + nums[2] - target)
        result = nums[0] + nums[1] + nums[2]
        for i in range(len(nums) - 2):
            if i == 0 or nums[i] > nums[i - 1]:
                left = i + 1
                right = len(nums) - 1
                while left < right:
                    sum = nums[i] + nums[left] + nums[right]
                    if sum == target:
                        mindiff = 0
                        return target
                    elif sum < target:
                        left += 1
                        if target - sum < mindiff:
                            mindiff = target - sum
                            result = sum
                    else:
                        right -= 1
                        if sum - target < mindiff:
                            mindiff = sum - target
                            result = sum
                    while left < right and nums[left] == nums[left-1]:    # skip duplicates
                        left += 1
                    if right < len(nums) - 1:
                        while left < right and nums[right] == nums[right + 1]:
                            right -= 1
        return result

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

class Solution:
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """	
        if digits == "":
            return []
        dic = {2:'abc',3:'def',4:'ghi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}
        a = ['']
        for d in digits:
            b = []
            for i in dic[int(d)]:
                for item in a:
                    item = item + i
                    b.append(item)
            a = b
        return a

18. 四数之和

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

思路:与三数之和相似 先固定nums[i] 再固定nums[j] 再移动left right指针

注意去重

class Solution:
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        s = []
        nums.sort()
        for i in range(len(nums) - 3):
            if i == 0 or nums[i] > nums[i - 1]:
                for j in range(i + 1,len(nums) - 2):
                    if j == i + 1 or nums[j] > nums[j - 1]:#注意这里的去重
                        left = j + 1
                        right = len(nums) - 1
                        while left < right:
                            sum = nums[i] + nums[j] + nums[left] + nums[right]
                            if sum == target:
                                s.append([nums[i],nums[j],nums[left],nums[right]])
                                left += 1
                                right -= 1
                                while left < right and nums[left] == nums[left-1]:    # skip duplicates
                                    left += 1
                                if right < len(nums) - 1:
                                    while left < right and nums[right] == nums[right + 1]:
                                        right -= 1
                            elif sum < target:
                                left += 1
                            else:
                                right -= 1
        return s

猜你喜欢

转载自blog.csdn.net/sinat_33969299/article/details/81124141