力扣刷题初体验(0)

70-118-119-509-746-53-121-338
其中746-53-121都有一个共同点,就是可以用两次for循环来实现,但是也可以用dp来实现,但是两次for循环代码运行会超时,所以需要使用dp的思想来优化代码。总体思想都是先初始化一个dp数组,然后dp[i]的值与前一项或者前两项有关,而当前的dp[i[是一种最大或者最小(考虑使用min和max函数)的情况,下面根据具体的题目分析每个数组的含义
746使用最小花费爬楼梯

输入一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请计算并返回达到楼梯顶部的最低花费。

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
支付 15 ,向上爬两个台阶,到达楼梯顶部
总花费为 15 。

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

"""
初始化dp数组,每个dp数组存储的是每次到达第i个阶梯的最小代价,然后就像爬楼梯(或者斐波那契数列)的想法一样,可以dp[i]可以由dp[i-1]和dp[i-2]得到
"""
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        l = [0 for i in range(len(cost)+1)] # 记录每次到达i楼梯的最小代价
        for i in range(len(cost)+1):
            if i == 0:
                l[0] = 0
                continue
            if i == 1:
                l[1] = 0
                continue
            else:
                l[i] = min(l[i-1] + cost[i-1],l[i-2] + cost[i-2])
        
        return l[-1]

53最大子数组和
输入一个整数数组 nums ,请找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
/--------------------------------------------------------------------------------------------------------------------------------------------------/
输入:nums = [1]
输出:1

"""
算法思想还是初始化一个dp数组,然后更新dp数组中的值,每一个dp数组中存储着到当前位置所能得到的最大子数组和,所以dp[i]与当前位置的那个数字(nums[i])或者dp[i-1]有关
"""
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        dp = [-100000]*(len(nums))
        print(dp)
        dp[0] = nums[0]
        for i in range(1,len(nums)):
            dp[i] = max(nums[i],nums[i]+dp[i-1])
        return max(dp)

121买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算所能获取的最大利润。
并返回你可以从这笔交易中获取的最大利润。如果不能获取任何利润,返回 0 。

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
//--------------------------------------------------------------------------------------------------------------------------------------------------
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

"""
这里直接记录题解,因为题解写的太好了!
显然,如果我们真的在买卖股票,我们肯定会想:如果我是在历史最低点买的股票就好了!太好了,在题目中,我们只要用一个变量记录一个历史最低价格 minprice,我们就可以假设自己的股票是在那天买的。那么我们在第 i 天卖出股票能得到的利润就是 prices[i] - minprice。

因此,我们只需要遍历价格数组一遍,记录历史最低点,然后在每一天考虑这么一个问题:如果我是在历史最低点买进的,那么我今天卖出能赚多少钱?(dp数组中存放的元素所代表的意思)当考虑完所有天数之时,我们就得到了最好的答案。

"""
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        ans = 0
        minn = prices[0]
        for i in range(len(prices)):
            ans = max(ans, prices[i] - minn)
            minn = min(minn,prices[i])
        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值