#213 [LeetCode]题解:House Robber II
题目来源
https://leetcode.com/problems/house-robber-ii/description/
题意分析
给定一个长度为n的环形序列,要求从中选取若干不相邻的数字,使得选取的数字和最大
题目思路
不难想到利用\(f[i]\)表示到第\(i\)个元素为止所得到的最大值,那么可以得到状态转移方程
f[i]=max(f[i−1],f[i−2]+a[i])2≤i<n其中a[i]为给定序列
f
[
i
]
=
m
a
x
(
f
[
i
−
1
]
,
f
[
i
−
2
]
+
a
[
i
]
)
2
≤
i
<
n
其
中
a
[
i
]
为
给
定
序
列
问题在于序列是环形的,这样无法规避首尾同时取到的情况。只需要用两个数组,规定其中一个必须取首位,另一个不能取首位,处理一下边界情况即可。
\(O(n)\)的时间复杂度
代码
class Solution:
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if n == 0: return 0
if n == 1: return nums[0]
f1 = [None] * n
f2 = [None] * n
f1[0], f2[0] = nums[0], 0
f1[1], f2[1] = nums[0], nums[1]
for i in range(2, n):
if i < n-1:
f1[i] = max(f1[i-1], f1[i-2] + nums[i])
f2[i] = max(f2[i-1], f2[i-2] + nums[i])
else:
f1[i] = f1[i-1]
f2[i] = f2[i-1];
if n > 3:
f2[i] = max(f2[i], f2[i-2] + nums[i])
return max(f1[n-1], f2[n-1])
#215 [LeetCode]题解:Kth Largest Element in an Array
题目来源
https://leetcode.com/problems/kth-largest-element-in-an-array/description/
题目分析
序列第k大。
题目思路
快排思想,利用区间第一个数划分序列。最坏情况\(O(nlogn)\)。
代码
class Solution:
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
n = len(nums)
k = n-k
st = 0
ed = n
while True:
#print(st, end = ' ')
#print(ed, end = ' ')
#print(k, end = ' ')
pos = self.quickSort(nums, st, ed)
#print(pos)
if pos == k:
return nums[k]
elif pos < k:
st = pos+1
else:
ed = pos+1
def quickSort(self, nums, st, ed):
if st + 1 == ed: return st
pos = st
pivot = nums[st]
for i in range(st+1, ed):
if nums[i] < pivot:
pos += 1
tmp = nums[pos]
nums[pos] = nums[i]
nums[i] = tmp
tmp = nums[pos]
nums[pos] = nums[st]
nums[st] = tmp
return pos