Leetcode_python_100-400题

118.杨辉三角
我的解法:

class Solution:
    def generate(self, numRows):
        """
        :type numRows: int
        :rtype: List[List[int]]
        """
        if numRows==0:
            return []
        if numRows==1:
            return [[1]]
        all_list=[[]]*numRows
        all_list[0]=[1]
        all_list[1]=[1,1]
        for i in range(2,numRows):
            all_list[i]=[None]*(i+1)
            all_list[i][0]=1
            all_list[i][-1]=1
            for j in range(1,i):
                all_list[i][j]=all_list[i-1][j-1]+all_list[i-1][j]
        return all_list


别人的代码。。。我真的不可能想到这么漂亮的解法啊。。。

class Solution:
    def generate(self, numRows):
        """
        :type numRows: int
        :rtype: List[List[int]]
        """
        res = [[1]]   
        for i in range(1,numRows):
            res.append(list(map(lambda x, y : x + y, res[-1]+[0], [0]+res[-1])))      
        return res[:numRows]    

136.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4
题目要求线性时间复杂度,真心做不到,看了大神的代码,给跪
任何数和0进行异或操作后保持不变,任何数与自己异或为0。a⊕b⊕a=b。异或满足加法结合律和交换律。

class Solution:
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        result=0
        for item in nums:
            result^=item
        return result

169.求众数
想了半天只想出枚举暴力求解,参考了大神的代码,跪了,真的没想到那边去。因为题目说了肯定有众数,那么将数组排序以后的中位数就一定是众数,代码只需要一行。。。。

class Solution:
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return sorted(nums)[int(len(nums)/2)]

然后还参考了另一个解法,先将数组设置为集合(重复的元素只计一个),然后对集合中的元素分别计算它在原来数组中的个数,将个数多于n/2的那个数返回。

class Solution:
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n=int(len(nums)/2)
        s=set(nums)
        for value in s:
            if nums.count(value)>n:
                return value

172.阶乘后的零
给定一个整数 n,返回 n! 结果尾数中零的数量。

示例 1:

输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:

输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。

思路:从5开始,计算阶乘过程中有几个5
解:

class Solution(object):
    def trailingZeroes(self, n):
        """
        :type n: int
        :rtype: int
        """
        r = 0
        while n >= 5:
            n = n // 5
            r+=n
        return r

~~*****198.打家劫舍 ***** ~~
这道题我还不是很理解。
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。
这题真的超出我这个小白的认知了。。。。
思路:回溯法:设dp[i]为前打劫的钱数,如果选nums[i],则意味着不能选nums[i-1]
则动态规划方程为:dp[i]=max(nums[i]+max(dp[i-2],dp[i-3]),dp[i-1])
(用dp[i]保存有i户人家时,能够偷窃到的最高的金额。显然,dp[1] = nums[1],dp[2] = max(nums[1],nums[2]),当i>=3时, dp[i] = max(dp[i-1],dp[i-2]+nums[i]),解释一下,如果第i户人家不偷的话,则dp[i] = dp[i-1];若第i户人家偷的话,dp[i] = dp[i-2]+nums[i],能偷的最高金额为两者的最大值。)

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]
        if n==2:
            return max(nums[0],nums[1])
        dp=[0]*n
        dp[0]=nums[0]
        dp[1]=nums[1]
        for i in range(2,n):
            dp[i]=max(nums[i]+max(dp[i-2],dp[i-3]),dp[i-1])
        return dp[-1]

202.快乐数
因为10以内的快乐数只有1和7,所以但递归到新的n只剩下一位数的时候,如果既不是1也不是7,那么肯定不是快乐数。
解:

class Solution:
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n<10:
            if n==1 or n==7:
                return True
            else:
                return False
        new_n=0
        while n:
            new_n+=(n%10)**2
            n=n//10
        return self.isHappy(new_n)

204.计数质数
统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

解:

class Solution(object):
    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        s[i : j : k]代表的意思是列表 s 中的第 i 个元素(包含), 到第 j 个元素(不包含),每隔 k 个数取一个形成的列表,即步长为k取出列表子集。
        """
        if n<=2:
            return 0
        prime=[1]*n
        prime[0]=prime[1]=0
        for i in range(2,int(n**0.5)+1):
            if prime[i]==1:
                prime[i*i:n:i]=[0]*len(prime[i*i:n:i])
        return sum(prime)

217.存在重复元素

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true
示例 2:

输入: [1,2,3,4]
输出: false
示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
解:

class Solution(object):
    def containsDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        nums.sort()
        for i in range(0, len(nums)-1):
            if nums[i] == nums[i+1]:
                return True
        return False

258.各位相加
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
我的解法:

class Solution:
    def addDigits(self, num):
        """
        :type num: int
        :rtype: int
        """
        new_num=0
        while num>0:
            new_num+=num%10
            num=num//10
        if new_num<10:
            return new_num
        else:
            return self.addDigits(new_num)

进阶解法:
思路:
ab = a * 10 + b
ab % 9 = (a9 + a + b) % 9 = (a + b) % 9
abc = a * 100 + b * 10 + c
abc % 9 = ( a
99 + a + b + c) % 9 = (a + b + c) % 9
代码:

class Solution(object):
    def addDigits(self, num):
        """
        :type num: int
        :rtype: int
        """
        if num<10:
            return num
        else:
            return 1+(num-1)%9 // 之所以-1后+1:是为了解决n%9=0的情况

263.丑数
编写一个程序判断给定的数是否为丑数。

丑数就是只包含质因数 2, 3, 5 的正整数。

示例 1:

输入: 6
输出: true
解释: 6 = 2 × 3
示例 2:

输入: 8
输出: true
解释: 8 = 2 × 2 × 2
示例 3:

输入: 14
输出: false
解释: 14 不是丑数,因为它包含了另外一个质因数 7。
说明:
1.1 是丑数。
2.输入不会超过 32 位有符号整数的范围: [−231, 231 − 1]。

class Solution(object):
    def isUgly(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n<=0:
       		return False
       	while n%2==0 or n%3==0 or n%5==0:
       		if n%2==0:
       			n=n/2
       		if n%3==0:
       			n=n/3
       		if n%5==0:
       			n=n/5
       	if n==1:
       		return True
       	else:
       		return False

389.找不同
给定两个字符串 s 和 t,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例:

输入:
s = “abcd”
t = “abcde”

输出:
e

解释:
‘e’ 是那个被添加的字母。

解:

class Solution:
    def findTheDifference(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        for value in t:
            if value not in s:
                return value
            else:
                if s.count(value)!=t.count(value):
                    return value

猜你喜欢

转载自blog.csdn.net/weixin_40848065/article/details/83450189
今日推荐