leepcode(斐波那契数列与float("inf")无穷大)解析

12、加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

解答:

a = ''
lis1 = []  ##定义一个空字符串和一个空列表
for i in digits:  
    a += str(i)  ##将列表里的的整数转换成字符串,并将字符串添加进空字符串a里
b = int(a) + 1  ##在将字符串a转换成整数,进行加法运算,并赋值给b。
for j in str(b):    ##将整数组b进行字符串转换,并拿出每个字符串
    lis1.append(int(j))  ##将字符串转换成整数,并添加进lis1的列表里
return lis1

13 、爬楼梯(该题用斐波那契数列求解)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            a = 1
            b = 2           
            for i in range(n-2):                
                a,b = b,a+b
            return b

补充点: 斐波那契数列

数列:1,1,2,3,5,8,13,21,34…n被称为斐波那契数列

特点:第一个、第二个数为1,从第三个开始,该值等于前面两个数之和。

当n>=2时,其值只与其前面两个数的值有关,所在在只需求出第n个值的时候,我们没必要浪费空间去存储在n前2个数之前的值。

14、合并两个有序数组

给定两个有序整数数组 nums1nums2,将 nums2 合并到 nums1使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1nums2 的元素数量分别为 mn
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

解答:

if n == 0: ##当n=0时,数组nums2为空,两组合并只有数组nums1的元素。
    nums1 = nums1
j = 0 and j <n  ##新设一个变量j
for i in range(m,len(nums1)): ##m代表是数组nums1的元素个数,len(nums1)代表数组nums1的索引值长度,取值范围设置到m,len(nums1)表示,可以计算出nums1中空值0的数量。
    if nums1[i] == 0:
        nums1[i] = nums2[j] ##每当nums1[i]等于0,就将nums2赋值给nums1
        j +=1
        if j == n :
            break
nums1.sort()  ##最后进行排序

15、买卖股票的最佳时机(用float(“inf”)无穷大来解答)

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

解答:(引用float(‘inf’)无穷大的特性来比对,从而提取数组中的最小值)float(“inf”)正无穷大 float(“-inf”)负无穷大

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        j = 0  
        l = float('inf') ##float('inf')表示正无穷大
        for i in prices:
            l = min(l,i) ##取数组中i与正无穷大的最小值
            j = max(j,i-l)  ##先用i减去每次循环的最小值得到每次循环的最大值
        return j

16 买卖股票的最佳时机2

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

解答:(既然可以多次交易,那么只要每次交易都有利润,那么就能买卖,我们就可以求利润>0的总和)

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        j = 0
        for i in range(len(prices)-1): ## 因为索引超出范围,所以要减去一个1
            if prices[i+1] - prices[i]>0:  ##如果每次买卖的利润>0 
                j += prices[i+1] -prices[i]  ##将每次的利润加在一块
        return (j)

17、只出现一次的数字

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

说明:

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

示例 1:

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

示例 2:

输入: [4,1,2,1,2]
输出: 4

解答:**题目中提到只有不重复的元素出现一次外,所有元素均出现两次,那么先用集合去重,剩下的元素都只有一次,再把这个集合*2,那么该集合的总和就比原先的数组得总和多了一个不重复元素的值,这个值就是我们所需要的。**

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        return((sum(set(nums)))*2 -sum(nums))
    原文作者:raynduan
    原文地址: https://www.cnblogs.com/raynduan/p/10883705.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞