class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
self.dfs(nums,[],res)
return res
def dfs(self,nums,path,res):
if len(nums) == 0:
res.append(path)
for i in range(len(nums)):
self.dfs(nums[:i]+nums[i+1:],path+[nums[i]],res)
47. 全排列 II(在全排列的基础上先对数组进行排序,递归时如果出现重复数字则略过)
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
nums.sort()
self.dfs(nums,[],res)
return res
def dfs(self,nums,path,res):
if len(nums) == 0:
res.append(path)
for i in range(len(nums)):
if i > 0 and nums[i] == nums[i-1]:
continue
else:
self.dfs(nums[:i]+nums[i+1:],path+[nums[i]],res)
25. K 个一组翻转链表(第一种:栈的方式)
class Solution(object):
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
res = ListNode(0)
p = res
while True:
count = k
tep = head
stack = []
while count and tep:
stack.append(tep)
tep = tep.next
count -= 1
if count:
p.next = head
break
while stack:
p.next = stack.pop()
p = p.next
p.next = tep
head = tep
return res.next
第二种:递归方法
class Solution(object):
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
cur = head
count = 0
while cur and count!=k:
cur = cur.next
count += 1
if count == k:
cur = self.reverseKGroup(cur,k)
while count:
head.next,cur,head = cur,head,head.next
count -= 1
head = cur
return head
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
if len(height) < 3:
return 0
left,right = 0,len(height)-1
res = 0
l_max,r_max = height[left],height[right]
while left < right:
l_max = max(l_max,height[left])
r_max = max(r_max,height[right])
if l_max <= r_max:
res += l_max - height[left]
left += 1
else:
res += r_max - height[right]
right -= 1
return res