zoukankan      html  css  js  c++  java
  • 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))
    
  • 相关阅读:
    spoj 694 求一个字符串中不同子串的个数
    Qt for Android 开发大坑
    HDUOJ A Mathematical Curiosity 1017
    Node.js开发入门—HelloWorld再分析
    GTK入门学习:布局容器之固定布局
    彻底领悟javascript中的exec与match方法
    JQuery中attr属性和jQuery.data()学习笔记
    正则表达式-验证带千分号的,带任意位小数的数字类型
    JQuery EasyUI 动态改变表单项的验证守则
    JavaScript计算两个日期的时间差
  • 原文地址:https://www.cnblogs.com/raynduan/p/10883705.html
Copyright © 2011-2022 走看看