首页 > 编程语言 >力扣121(java&python)-买卖股票的最佳时机(简单)

力扣121(java&python)-买卖股票的最佳时机(简单)

时间:2022-10-22 10:35:31浏览次数:49  
标签:java python 力扣 int prices return minprice dp 利润

题目:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

 

示例 1:

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

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

提示:

1 <= prices.length <= 105
0 <= prices[i] <= 104

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

动态规划:

动态规划做题步骤:

1.明确dp[i]所代表的含义?(二维dp[i][i])

2.根据dp[i]和dp[i-1]的关系得到状态转移方程;

3.确定初始条件dp[0]。

所以这道题买卖股票的最佳时机是由之前买或者不买的状态决定的,而之前的状态又由它之前的状态决定的,dp[i]代表前 i 天的最大利润,所以状态转移方程为dp[i] = max(dp[i-1], prices[i] - minprices)

java代码:

 1 class Solution {
 2     public int maxProfit(int[] prices) {
 3         int n = prices.length;
 4         int[] dp = new int[n];
 5         //dp数组初始化
 6         dp[0] = 0;
 7         //设定初始最低价格就为第一个价格
 8         int minprice = prices[0];
 9         for(int i = 1; i < n; i++){
10             dp[i] = Math.max(dp[i-1], prices[i] - minprice);
11             minprice = Math.min(minprice, prices[i]);
12         }
13         return dp[n - 1];
14     }
15 }

 python3代码:

1 class Solution:
2     def maxProfit(self, prices: List[int]) -> int:
3         n = len(prices)
4         dp = [0] * n
5         minprice = prices[0]
6         for i in range(1, n):
7             dp[i] = max(dp[i -1], prices[i] - minprice)
8             minprice = min(minprice, prices[i])
9         return dp[-1]

 解释:

① dp = [0] * n:浅拷贝,也就是把一个列表重复了n次,例如dp = [0] * 4结果为dp = [0,0,0,0]

     区别:[0 for _ in range(n)] :这是深拷贝,创建。

②最后返回的是dp[-1]:在python语法中,[-1]代表的是最后一个元素,如果写成dp[n],就会导致越界,数组的最大下标为n-1。

③可以省略 if n == 0: return 0,因为题目中已经明确prices.length是大于等于1的,并不会存在长度为0的情况。

标签:java,python,力扣,int,prices,return,minprice,dp,利润
From: https://www.cnblogs.com/liu-myu/p/16815462.html

相关文章

  • python里面用append把一个数组压到另一个数组里面,原来的数组如果再append东西,后来的数
    在python里有一个非常烦人的问题就是给数组填充新值时,假如用append的方法,最终填充进数组的不是实际的值,而是类似于一个指针(比喻一下,和指针的差别还是很大的)如果原数组继续a......
  • java springboot MINIO 集成
    <!--miniohttps://www.minio.org.cn/download.shtml#/linux--><dependency><groupId>io.minio</groupId><artifactId>minio</art......
  • javase重开2022年9月21日
    Boolean类型java中返回trueorfalse而在C语言中返回0表示false其余皆为true类型转换隐式类型转换隐式类型转换支持字节数小的类型自动转换为字节数大的类型,整数类......
  • Python字符串与数组相互转换
    Python中有join()和os.path.join()两个函数,具体作用如下:join():连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串os.path.jo......
  • Golang 和 Python 随机生成N位字符串
    Golang:funcRandomString(nint)string{ varletters=[]byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789") result:=make([]byte,n) /......
  • java读取文件并统计出现前N个单词
    Java文件操作---输出单个文件中常出现的前N个英语单词-千幽行-博客园(cnblogs.com)packageclasstest;importjava.io.BufferedReader;importjava.io.File;imp......
  • Java多线程(1):线程生命周期
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 从事Java开发这些年来,如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫......
  • Python: Facade Pattern
    DuFacade.pyimportosimportreimportthreading#外观模式FacadePatternclass_IgnitionSystem(object):@staticmethoddefproduce_spark():......
  • JavaScript中的Generator生成器的基本用法
    ES6入门-阮一峰:Generator函数1.介绍Generator生成器是ES6提供的一种异步编程解决方案。是一个极为灵活的结构,拥有在函数块中暂停和恢复代码执行的能力。执行Gen......
  • Java语言程序设计第五讲,异常处理
    学习Java变成过程中我们遇到过许多程序报错现象之后我们会查看报错原因,对代码进行有针对性的修改从而使其恢复正常 这就是异常处理的目的和用途:计算机提供准确的错徐信......