(1)Best Time to Buy and Sell Stock

Total Accepted: 10430 Total Submissions: 33800My Submissions

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.

url:http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock/

测试用例

空数组:  []

只有一个元素的数组: [1]

所有收益均为负数的数组: [8,7,4,2]

这一题,首先使用的是暴力办法,中间做了一些局部优化,但是总体复杂度仍然是O(n2),于是乎,妥妥的Time Limit Exceeded,下面是暴力代码

public int maxProfit(int[] prices){

        

        int i,j,max,temp,holda,holdb;

        if(prices.length==0 || prices.length==1){

            return 0;

        }

        temp = prices[0];

        max = prices[1]-prices[0];

        for(i=0;i<prices.length-1;i++){

            if(prices[i]<temp){

                temp = prices[i];

                for(j=i;j<prices.length;j++){

                    if(prices[j]-prices[i]>max){

                        max = prices[j]-prices[i];

                        holda = i;

                        holdb = j;

                    }

                }

            }

            

        }

        return max;

    }

既然TLE了,于是乎,就去想办法了。

可以得到如果本月买入,下个卖出能够得到的收益,然后股票的最大收益问题就变成了一个已知int数组的最大和子串问题。而这个问题本身有很成熟的解决方案:暴力循环--》O(n2),递归--》O(nlgn),动态规划--》O(n) 都可以解决。

/*复杂度:O(n):accpt*/

public class Solution {

        public int maxProfit(int[] prices){

        

        int temp = 0;

        int max = 0;

        int[] det = new int[prices.length];

        for(int i=0;i<prices.length-1;i++){

            det[i] = prices[i+1]-prices[i];

        }

        for(int i=0;i<det.length;i++){

            temp = temp + det[i];

            if(temp < 0){

                temp = 0;

            }

            if(temp > max){

                max = temp;

            }

        }

        return max;

    }

}

本题也可以使用下面一题里面的思路,求出所有波段的profit值,在过程中记录获利最大的一个波段,复杂度同样为O(n)。

(2)Best Time to Buy and Sell Stock II

Total Accepted: 10315 Total Submissions: 29085My SubmissionsSay 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).

url:http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/

测试用例:

空数组:  []

只有一个元素的数组: [1]

所有收益均为负数的数组: [8,7,4,2]

算法:周期性检查波底和封顶的值,profit=prices[封顶]-price[波底];直到数组全部元素都结束,注意点主要是边界值不能越界。

/*算法复杂度:O(n)*/

public class Solution {

    public int maxProfit(int[] prices) {

 

        int profit = 0;

        int minPos = 0;

        int maxPos = 0;

 

        while (maxPos < prices.length-1) {

            minPos = findMin(prices, maxPos);

            maxPos = findMax(prices, minPos);

            profit = profit +( prices[maxPos] - prices[minPos]);

        }

        return profit;

    }

 

    public int findMax(int[] prices, int pos) {

        int i;

        for(i=pos;i<prices.length-1 && prices[i+1]>=prices[i];i++){

        }

        return i;

    }

 

    public int findMin(int[] prices, int pos) {

        int i;

        for(i=pos;i<prices.length-1 && prices[i+1]<=prices[i];i++){

        }

        return i;

    }

}

leetcode刷题笔记的更多相关文章

  1. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  2. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  3. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  4. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  5. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  6. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  7. LeetCode刷题笔记-回溯法-分割回文串

    题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...

  8. leetcode刷题笔记231 2的幂

    题目描述: 给定一个整数,写一个函数来判断它是否是2的幂. 题目分析: 判断一个整数是不是2的幂,可根据二进制来分析.2的幂如2,4,8,等有一个特点: 二进制数首位为1,其他位为0,如2为10,4为 ...

  9. leetcode刷题笔记342 4的幂

    题目描述: 给定一个整数 (32位有符整数型),请写出一个函数来检验它是否是4的幂. 示例:当 num = 16 时 ,返回 true . 当 num = 5时,返回 false. 问题进阶:你能不使 ...

随机推荐

  1. Android——显示单位px和dip以及sp的区别

    dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素.d ...

  2. unique踢出相同元素

    unique函数的功能是:去除相邻的重复元素(只保留一个). 函数参数:unique(first,last,compare); //first为容器的首迭代器,last为容器的末迭代器,compare ...

  3. Asp.net下载文件

    网站上的文件是临时文件, 浏览器下载完成, 网站需要将其删除. 下面的写法, 文件读写后没关闭, 经常删除失败. /// <summary> /// 下载服务器文件,参数一物理文件路径(含 ...

  4. 使用postman玩转接口测试

    (一)前言: 之前搞自动化接口测试,由于接口的特性,要验证接口返回xml中的数据,所以没找到合适的轮子,就自己用requests造了个轮子,用着也还行,不过就是case管理有些麻烦,近几天又回头看了看 ...

  5. Centos7 install Openstack - (第四节)添加计算服务(Nova)

    Centos7 install Openstack - (第四节)添加计算服务(Nova) 我的blog地址:http://www.cnblogs.com/caoguo 该文根据openstack官方 ...

  6. 【PL/SQL练习】函数

    1.必须返回一个值2.只能在表达式调用 SQL> create or replace function fun1 return number is v_sum_sal emp.sal%type; ...

  7. 【测试】自行建表并演示append+nologging,并描述数据写入后产生的效果

    ①创建表: SQL> create table t4 as select * from all_objects; Table created. ②设置t4处于nologging: SQL> ...

  8. 集合函数COUNT

    直接计算函数COUNT(*)的值,例如,计算pet表中猫的只数: 计算pet表中species的列的数目: 假如你想知道有多少不同种类的的宠物数目.你可以通过使用关键字DISTINCT来得到该数目: ...

  9. Android学习笔记之AndroidManifest.xml文件解析

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  10. 运用Ntop监控网络流量(视频Demo)

    运用Ntop监控网络流量 ____网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降.网络性能降低.通过流量 ...