Top 100 Linked Question 修炼------第十五题、第十七题

15.3Sum

题目链接

题目解释:给定义一个list,求其中三个数之和为0的序列

题目分析:三个数字之和为0,那么我们可以采取这样的方式:先将给定的list排序,采用待定系数法,先确定一个数,然后从下一个数和最右边的数开始向中间遍历,找到三数之和为0的时候直接加入到最后的结果中,然后后面的时候在进行遍历即可。

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        res=[]
        # list 进行排序
        nums.sort()
        for i in range(len(nums)-2):
            # 如果之前已经遍历到了这个数,避免重复,应该跳过
            if i>0 and nums[i]==nums[i-1]:
                continue
            l,r=i+1,len(nums)-1
            while l<r:
                s=nums[i]+nums[l]+nums[r]
                if s>0:
                    r-=1
                elif s<0:
                    l+=1
                else:
                    res.append([nums[i],nums[l],nums[r]])
                    # 避免在list中加入相同的元素
                    while l < r and nums[l] == nums[l+1]:
                        l += 1
                    while l < r and nums[r] == nums[r-1]:
                        r -= 1
                    l += 1; r -= 1
        return res

17.Letter Combinations of a Phone Number

题目链接

题目解释:使用常见的语言来解释啦,假设你手机上打字的时候是九宫格,然后你在按键的时候按的是数字,数字下方也对应着几个字母,那么在你按数字的时候,相应的字母有多少种排列组合呢?如题目上面给定的例子:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

好了,题目的意思就简单解释到这里。下面直接看本人的解题方式

解题思路:最直观的想法就是采用dict,输入的数字作为key,然后相关的字符作为value,那么就可以采用一一对应的关系来求得所有的字符,这个解题思路对应于下面的代码,同时本题也采用了回溯法的思想去解决:

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        phone = {'2': ['a', 'b', 'c'],
                 '3': ['d', 'e', 'f'],
                 '4': ['g', 'h', 'i'],
                 '5': ['j', 'k', 'l'],
                 '6': ['m', 'n', 'o'],
                 '7': ['p', 'q', 'r', 's'],
                 '8': ['t', 'u', 'v'],
                 '9': ['w', 'x', 'y', 'z']}

        def backtrack(combination, next_digits):
            # 若已经匹配到了输入数据的最后
            if len(next_digits) == 0:
                output.append(combination)
            else:
                for letter in phone[next_digits[0]]:
                    backtrack(combination + letter, next_digits[1:])

        output = []
        if digits:
            backtrack("", digits)
        return output

本来以为到了这个地步就是已经完成了,但是本着人生苦短,我用python的思想,继续按照大佬们的思路,采用回溯法继续进行了一波改进,代码显得更加精炼:

class Solution:
    def letterCombinations(self, digits):
        mapping = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', 
                   '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'}
        if len(digits) == 0:
            return []
        if len(digits) == 1:
            return list(mapping[digits[0]])
        prev = self.letterCombinations(digits[:-1])
        additional = mapping[digits[-1]]
        # python 列表生成式技巧
        return [s + c for s in prev for c in additional]

总结

每天进步一点点,健康快乐每一天...

猜你喜欢

转载自blog.csdn.net/sir_TI/article/details/88526855