299.Bulls and Cows
代码:
class Solution:
def getHint(self, secret, guess):
"""
:type secret: str
:type guess: str
:rtype: str
"""
bull = 0
cow = 0
digit_secret = {}
digit_guess = {}
for i in range(len(secret)):
if secret[i]==guess[i]:
bull+=1
continue
digit_secret[secret[i]] = digit_secret.get(secret[i],0) + 1
digit_guess[guess[i]] = digit_guess.get(guess[i],0) + 1
for key,value in digit_secret.items():
if key in digit_guess:
cow += min(value,digit_guess[key])
return str(bull)+'A'+str(cow)+'B'
思路:
首先,遍历一遍secret,若guess的相同位置上的数字相同,则bull++,否则,将两个数字出现的次数各自记录在dict中。
最后,遍历secret的dict,从而得到cow。
代码:
class Solution:
def canCompleteCircuit(self, gas, cost):
"""
:type gas: List[int]
:type cost: List[int]
:rtype: int
"""
start = len(gas)-1
end = 0
reminder = gas[start]-cost[start]
while(start>end):
if reminder>=0:
reminder+=gas[end]-cost[end]
end+=1
else:
start-=1
reminder+=gas[start]-cost[start]
if reminder<0:
return -1
return start
思路:
首先,考虑这样一个事实:无论起点在哪,行程都应该从左往右前进(达到最右方时,下一步将到达最左方),且经过所有站点后所剩汽油应大于等于零。
接着,我们令 reminder 代表汽车所剩汽油,令起点为最右方站点,终点为最左方站点(暂时,因为这样未构成一个解)。
很明显,当所剩汽油大于等于零时,汽车可以开往下一个站点,故终点向右移一个,并更新所剩汽油;当所剩汽油小于零时,说明从目前的起点开始不能得到一个解,故将起点向左一个,并更新所剩汽油(相当于遍历所有可能解,但是暴力要好,因为保留了之前的计算结果)。
代码:
class Solution:
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
if numRows==0:
return []
result = [[1]]
if numRows==1:
return result
result.append([1,1])
if numRows==2:
return result
for i in range(2,numRows):
tmp = [1]
for j in range(1,i):
tmp.append(result[i-1][j-1]+result[i-1][j])
tmp.append(1)
result.append(tmp)
return result
思路:
这道题注意下 numRows 为零时的情况,接着逐层构造即可。
119. Pascal’s Triangle II
代码:
class Solution:
def getRow(self, rowIndex):
"""
:type rowIndex: int
:rtype: List[int]
"""
if rowIndex==0:
return [1]
elif rowIndex==1:
return [1,1]
result = [1,1]
for i in range(2,rowIndex+1):
for j in range(i-1,0,-1):
result[j] = result[j-1] + result[j]
result.append(1)
return result
思路:
注意空间要求,构造时由后往前构造即可。
169. Majority Element
代码:
class Solution:
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return sorted(nums)[len(nums)//2]
思路:
由题目可知,所求数字一定在排序后的数组中下标为 len(nums)//2 的位置。
这道题让我想到一个面试题:给定一个数组,长度为 N (N为奇数),存在一个数字出现次数超过 (N-1)/2 次,如何找出?
当时的想法是:每次去除两个不相同的数字,最后留下的即为所找目标。
如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!
作者信息:
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink