[刷题] LeetCode刷题-Array-Python (2)

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。

结果:
299. Bulls and Cows
134. Gas Station

代码:

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 代表汽车所剩汽油,令起点为最右方站点,终点为最左方站点(暂时,因为这样未构成一个解)。
很明显,当所剩汽油大于等于零时,汽车可以开往下一个站点,故终点向右移一个,并更新所剩汽油;当所剩汽油小于零时,说明从目前的起点开始不能得到一个解,故将起点向左一个,并更新所剩汽油(相当于遍历所有可能解,但是暴力要好,因为保留了之前的计算结果)。

结果:
134. Gas Station
118. Pascal’s Triangle

代码:

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 为零时的情况,接着逐层构造即可。

结果:
118. Pascal's Triangle

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

思路:
注意空间要求,构造时由后往前构造即可。

结果:
119. Pascal's Triangle II

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 次,如何找出?
当时的想法是:每次去除两个不相同的数字,最后留下的即为所找目标。

结果:
169. Majority Element

如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!

作者信息:
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink

你可能感兴趣的:(LeetCode,LeetCode,刷题日记)