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]
总结
每天进步一点点,健康快乐每一天...