Python LeetCode(六)
优化
Increasing Subsequences
class Solution(object):
def findSubsequences(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def recursive(nums, arr, last):
if len(arr) >= 2 and arr not in result:
result.append(arr[:])
for i in range(len(nums)):
if last and nums[i] >= last:
arr.append(nums[i])
recursive(nums[i + 1:], arr, nums[i])
arr.pop()
result = []
for i in range(len(nums)):
recursive(nums[i+1:], [nums[i]], nums[i])
return result
class Solution(object):
def findSubsequences(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def recursive(nums, arr):
if len(arr) >= 2 and arr not in result:
result.append(arr[:])
for i in range(len(nums)):
if len(arr) == 0 or nums[i] >= arr[-1]:
arr.append(nums[i])
recursive(nums[i + 1:], arr)
arr.pop()
result = []
recursive(nums, [])
return result
import copy
class Solution(object):
def findSubsequences(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
subs = {()}
for num in nums:
for sub in copy.copy(subs):
if not sub or sub[-1] <= num:
newsub = sub + (num,)
subs.add(newsub)
# 过滤掉那些包括空集和个数为1的集合
return [list(x) for x in subs if len(x) >= 2]
class Solution(object):
def findSubsequences(self, nums):
subs = {()}
for num in nums:
subs |= {sub + (num,)
for sub in subs
if not sub or sub[-1] <= num}
return [sub for sub in subs if len(sub) >= 2]
class Solution(object):
def findSubsequences(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if len(nums) < 2:
return []
if len(nums) == 2:
return [nums] * int(bool(nums[0] <= nums[1]))
a = {(nums[0], nums[1])} if nums[0] <= nums[1] else {()}
for t in range(2, len(nums)):
# 前者将a中的set都加上当前值,比如{1,2,3}遇见4变成{1,2,3,4}
# 后者将循环前面的值加上当前值构成一个长度为2的set,比如{1,2,3}遇见4变成{1,4}和{2,4}和{3,4}
# 最后在进行或操作
a |= set([i + (nums[t],) for i in a if i[-1] <= nums[t]]) | \
set((j, nums[t]) for j in nums[:t] if j <= nums[t])
return list(a)
# 优化后的结果
class Solution(object):
def recursive(self, nums, result, arr):
if len(arr) >= 2:
result.append(arr[:])
unique = []
for i in range(len(nums)):
# 防止回溯的时候加入旧的值
if nums[i] in unique:
continue
if len(arr) == 0 or nums[i] >= arr[-1]:
arr.append(nums[i])
unique.append(nums[i])
self.recursive(nums[i + 1:], result, arr)
arr.pop()
def findSubsequences(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
self.recursive(nums, result, [])
return result
2. Construct Binary Tree from Preorder and Inorder Traversal
class Solution(object):
def rebuild(self, preorder, inorder):
if len(preorder) == 0 or len(inorder) == 0:
return None
root = TreeNode(preorder[0])
idx = inorder.index(preorder[0])
root.left = self.rebuild(preorder[1:idx+1], inorder[:idx])
root.right = self.rebuild(preorder[idx+1:], inorder[idx+1:])
return root
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
return self.rebuild(preorder, inorder)
class Solution(object):
def rebuild(self, preorder, inorder, inorder_index, pre_start, pre_end, in_start, in_end):
if pre_end - pre_start < 0:
return None
root = TreeNode(preorder[pre_start])
idx = inorder_index[root.val]
root.left = self.rebuild(preorder, inorder, inorder_index,
pre_start + 1, pre_start + idx - in_start,
in_start, idx - 1)
root.right = self.rebuild(preorder, inorder, inorder_index,
pre_start + idx - in_start+1, pre_end,
idx + 1, in_end)
return root
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
inorder_index = {x: i for i, x in enumerate(inorder)}
return self.rebuild(preorder, inorder, inorder_index,
0, len(preorder)-1, 0, len(inorder)-1)
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if not preorder:
return None
root=TreeNode(preorder[0])
stack=[root]
i,j = 1,0
while i<len(preorder):
temp=None
cur=TreeNode(preorder[i])
# 如果相等表示栈中的多个值开始和inorder相互对应起来了
# 那么最后一个弹出的则是中间结点
while stack and stack[-1].val==inorder[j]:
temp=stack.pop()
j+=1
# 此时temp是中间结点
if temp:
temp.right=cur
else:
# 往深处递归
stack[-1].left=cur
stack.append(cur)
i+=1
return root
3. LRU Cache
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.d = dict()
self.arr = []
self.capacity = capacity
def get(self, key):
"""
:type key: int
:rtype: int
"""
if key not in self.arr or len(self.arr) == 0:
return -1
self.arr.remove(key)
self.arr.insert(0, key)
return self.d.get(key, -1)
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
self.d[key] = value
if key not in self.arr:
if len(self.arr) == self.capacity:
last = self.arr.pop()
del self.d[last]
else:
self.arr.remove(key)
self.arr.insert(0, key)
import collections
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.queue = collections.deque() # 纪录顺序
self.cap = capacity
self.cache = {} # 纪录访问过的纪录
self.cnt = {} # 纪录访问过的纪录的次数
def get(self, key):
"""
:type key: int
:rtype: int
"""
if key in self.cache:
self.queue.append(key)
self.cnt[key] += 1
return self.cache[key]
else:
return -1
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
self.cache[key] = value
self.queue.append(key)
self.cnt[key] = self.cnt.get(key, 0) + 1
while len(self.cache) > self.cap:
k = self.queue.popleft()
self.cnt[k] -= 1
if self.cnt[k] == 0:
del self.cnt[k]
del self.cache[k]
class Node(object):
def __init__(self, key=None, value=None, next=None, prev=None):
self.key = key
self.value = value
self.next = next
self.prev = prev
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.capacity = capacity
# single linked list with a head node
# always put new node to the tail
# also move the revisted node to the tail
self.head = Node()
self.tail = self.head
self.head.next = self.tail
# <key, node.prev>
self.hash_table = {}
def pop_front(self):
del self.hash_table[self.head.next.key]
p_next = self.head.next.next
self.head.next = p_next
# update the reference for new front node
self.hash_table[self.head.next.key] = self.head
def append(self, node):
self.hash_table[node.key] = self.tail
self.tail.next = node
self.tail = node
def move_to_end(self, prev):
node = prev.next
if node == self.tail:
return
# disconnect node
prev.next = node.next
node.next = None
self.hash_table[prev.next.key] = prev
# append node
self.append(node)
def get(self, key):
"""
:type key: int
:rtype: int
"""
if key not in self.hash_table:
return -1
prev = self.hash_table[key]
val = prev.next.value
self.move_to_end(prev)
return val
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
if key in self.hash_table:
prev = self.hash_table[key]
prev.next.value = value
self.move_to_end(prev)
else:
self.append(Node(key, value))
if len(self.hash_table) > self.capacity:
self.pop_front()
4. Implement Queue using Stacks
class MyQueue(object):
def __init__(self):
"""
Initialize your data structure here.
"""
self.stack = []
self.stack_temp = []
def push(self, x):
"""
Push element x to the back of queue.
:type x: int
:rtype: void
"""
if self.stack_temp:
while self.stack_temp:
self.stack.append(self.stack_temp.pop())
self.stack.append(x)
def pop(self):
"""
Removes the element from in front of queue and returns that element.
:rtype: int
"""
while self.stack:
self.stack_temp.append(self.stack.pop())
if self.stack_temp:
return self.stack_temp.pop()
return None
def peek(self):
"""
Get the front element.
:rtype: int
"""
if self.stack_temp:
return self.stack_temp[len(self.stack_temp)-1]
elif self.stack:
while self.stack:
self.stack_temp.append(self.stack.pop())
if self.stack_temp:
return self.stack_temp[len(self.stack)-1]
return None
def empty(self):
"""
Returns whether the queue is empty.
:rtype: bool
"""
return False if self.stack or self.stack_temp else True
class MyQueue(object):
def __init__(self):
"""
Initialize your data structure here.
"""
self.stack = []
def push(self, x):
"""
Push element x to the back of queue.
:type x: int
:rtype: void
"""
self.stack.append(x)
def pop(self):
"""
Removes the element from in front of queue and returns that element.
:rtype: int
"""
if not self.empty():
self._stack = []
while len(self.stack) > 1:
self._stack.append(self.stack.pop())
val = self.stack.pop()
while self._stack:
self.stack.append(self._stack.pop())
return val
def peek(self):
"""
Get the front element.
:rtype: int
"""
if not self.empty():
return self.stack[0]
def empty(self):
"""
Returns whether the queue is empty.
:rtype: bool
"""
return not self.stack
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法


浙公网安备 33010602011771号