Best Time to Buy and Sell Stock I && II && III

题目1:Best Time to Buy and Sell Stock

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

分析:
题意给我们一个数组prices[], 用来表示股票每一天的价格,问我们如果“只多进行一次交易”(即买进之后再卖出), 应该在哪天买进,哪天卖出所获得的利润能达到最大值。
如:prices={1, 3, 4, 10, 1};
那么最大的利润是第一天买进(价格为1),然后第四天卖出(价格为10), 利润最大为9

明白了题意之后,我们来看看能怎样解决这道题目。
由于是只能交易一次,而且必须先有“买进”,才能有“卖出”
因此我们只需要数组的最后一位往前扫描,依次得到哪一天的prices是最大的(设为maxPrices),然后在算出和这一天前面的某一天prices[i]的差值 (maxPrices - prices[i]),如果大于最大的利润值,则更新最大利润值maxMoney;

AC代码: 
public class Solution {
    
    public int maxProfit(int[] prices) {
        int size = prices.length;
        if (size == 0){
            return 0;
        }
        int maxPrice = prices[size-1];//初始化最大price
        int maxMoney = 0;//初始化利润值
        for (int i=size-1; i>=0; --i){
            maxPrice = maxPrice > prices[i] ? maxPrice : prices[i];//如果第i天的值大于最大price,则更新最大price的值
            maxMoney = maxMoney > (maxPrice - prices[i]) ? maxMoney : (maxPrice - prices[i]);//更新最大利润值
        }
        return maxMoney;
    }
}

题目2:Best Time to Buy and Sell Stock II

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).


分析:

这道题目,关键是要理解题意,题意中和题目I是有点像,唯一不同的是这道题目可以进行多次交易,但是要注意的是,每次最多只能持有一支股票在手上,也就是说你要再买入的时候,必须先把手头上的这股票先卖掉!
举个例子:如Prices[] = {1,3,4,10,2};
这样子的话,你可以采取的方式有
1、第1天买入(price==1),第2天卖出 (price==3), 第3天买入(price==4),第4天卖出(price==10)  :   8
2、第1天买入(price==1),第3天卖出(price==4)       : 3
3、第2天买入 (price==3),第3天卖出(price==4)       : 1
4、第3天买入(price==4),第4天卖出(price==10)     : 6
5、第1天买入 (price==1),第4天卖出(price==10)     : 9
但其实如果仔细观察容易发现 : 
3 - 1 = 2
4 - 3 = 1
10 - 4 = 6

然后result = 2 + 1 + 6 = 9
因此其实我们只是要找增长的序列对,并求出他们的差值的和
index :  1 ~~ prices.size()-1
通过这样分析的话,我们很容易知道其实只要从头到尾遍历,如果 prices[index] > prices[index-1] 

AC代码:
public class Solution {
    public int maxProfit(int[] prices) {
        int profit = 0;
        int size = prices.length;
        if (size < 2){
            return profit;
        }
        for (int index=1; index<size; ++index){
            int value = prices[index] - prices[index-1];
            if (value > 0){
                profit += value;
            }
        }
        return profit;
    }
}


题目3:

Best Time to Buy and Sell Stock III

 

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most two transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

分析:
由于最多只可以进行两次交易,而且两次交易之间必须没有交集。
这题用DP来做.
那我们很容易想到,将数组划分成两块,左边一块 | 右边一块,我们只需要求出左边的最大利润,再求出右边的最大利润,然后相加起来就得到了利润的最大值
我们用
用left[i] 来表示[0,...,i]中的最大利润
用right[i]来表示[i,...,n-1]上的最大利润

AC代码:
public class Solution {
    public int maxProfit(int[] prices) {
        int size = prices.length;
        if (size < 2)
            return 0;
        int[] left = new int[size];
        int[] right = new int[size];
        int minValue = prices[0];
        int maxValue = prices[size-1];
        for (int i=1; i<size; ++i){
            left[i] = left[i-1] > (prices[i] - minValue) ? left[i-1] : (prices[i] - minValue);
            minValue = minValue < prices[i] ? minValue : prices[i];
        }
        for (int i=size-2; i>=0; --i){
            right[i] = right[i+1] > (maxValue - prices[i]) ? right[i+1] : (maxValue - prices[i]);
            maxValue = maxValue > prices[i] ? maxValue : prices[i];
        }
        int profit=0;
        for (int i=0; i<size; ++i){
            profit = profit > (left[i] + right[i]) ? profit : (left[i] + right[i]);
        }
        return profit;
    }
}


已标记关键词 清除标记
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页