169. Majority Element
题目解释:给出一个长度为n的数组,找到主元素。这个主元素是在这个数组中出现的次数超过了数组长度的一半。假设这个数组非空以及主元素是存在的。
Example 1:
Input: [3,2,3]
Output: 3
Example 2:
Input: [2,2,1,1,1,2,2]
Output: 2
题目分析:数组的长度我们可以一下子确定出来,但是怎么能确定某一个元素是不是主元素呢?
最简单的方式我们可以通过将数组进行排序,因为主元素一定存在,那么必然存在这个特点:[n/2]位置的元素一定是主元素,于是得到今日份简介代码:
def majorityElement(self,nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
return nums[len(nums)//2]
时间复杂度:O(n)
题目简单,我们可以再进行发散一下思路,我们在操作的时候也可以设置标志位来进行,设置一个count和candidate来进行操作:
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count = 0
candidate = None
for num in nums:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
return candidate
再给出一种做法是基于Python强大的内置类,通过Counter来计数,最后选择最大的数即可。
def majorityElement(self,nums):
"""
使用HashMap
:param nums:
:return:
"""
import collections
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
198. House Robber
题目解释:假设你是一个专业的盗贼,你想盗窃一条街房间里面的物品。每个房间里面都要存放有特定的金钱。唯一限制你进行盗窃的是相邻的房间都有报警系统相连,如果两个相邻的房间在同一天晚上被盗窃了,那么报警器会自动的呼叫警察。
给定一系列非负整数代表每个房子所含有的金钱,假设你是盗贼,确定你在不惊动警察的情况下,你所能盗取的最大的钱的数目。
Example 1:
Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.
Example 2:
Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
Total amount you can rob = 2 + 9 + 1 = 12.
题目分析:首先看到这个题目的时候,观察后面题目给出的要求:要求获取最大的钱数,那么应该能够想到的方法中应该是存在动态规划这个算法的。因为在求解最值的时候,动态规划是我们常用的一个方法。使用动态规划的关键是找到状态转移方程,那么接下来是分析状态转移方程的由来:
对于第i个位置的房子,可供盗贼选择的有两个状态:抢或者不抢。如果选择抢,那么其获得总收益为dp[i-2]+nums[i](因为存在限制问题,若要抢劫第i间房子,那么第i-1间房子就是不能被盗窃的对象);如果选择不抢,那么到第i间房子为止,所获得的最大的收益为dp[i-1]。于是我们就是要取这两者之间的最大值即可。
dp[i]=max(dp[i-1],dp[i-2]+nums[i])
有了状态转移方程,那么边界条件和最优值函数也就特别简单了。于是可以直接得出下面的代码:
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if not n:
return 0
elif n == 1:
return nums[0]
# 是指动态规划数组
robValues = [0] * n
robValues[0] = nums[0]
robValues[1] = max(nums[:2])
for i in range(2, n):
robValues[i] = max(nums[i] + robValues[i - 2], robValues[i - 1])
return robValues[n - 1]
总结
2019-5-6日,五一小长假过去啦.....