算法: 买卖股票的时间 121. Best Time to Buy and Sell Stock

算法: 买卖股票的时间 121. Best Time to Buy and Sell Stock

You are given an array prices where prices[i] is the price of a given stock on the ith day.

You want to maximize your profit by choosing a single day to buy one stock and choosing a different day in the future to sell that stock.

Return the maximum profit you can achieve from this transaction. If you cannot achieve any profit, return 0.

Example 1:

Input: prices = [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Note that buying on day 2 and selling on day 1 is not allowed because you must buy before you sell.

Example 2:

Input: prices = [7,6,4,3,1]
Output: 0
Explanation: In this case, no transactions are done and the max profit = 0.

Constraints:

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

1. 当前值减去最小值法

class Solution {
    public int maxProfit(int[] prices) {
        int low = prices[0];
        int max = 0;
        int gap = 0;
        for (int i = 1; i < prices.length; i++) {
            low = prices[i] < low ? prices[i] : low;
            gap = prices[i] - low;
            max = Math.max(max, gap);
        }
        
        return max;
    }
}

2. Kadane 的算法

解决这个问题的逻辑与使用Kadane’s Algorithm. 由于到目前为止还没有任何机构提到这一点,我认为每个人都知道这是一件好事。

所有直接的解决方案都应该有效,但是如果面试官通过给出价格差异数组来稍微扭曲问题,例如:for {1, 7, 4, 11},如果他给出{0, 6, -3, 7},你最终可能会感到困惑。

这里的逻辑是计算maxCur += prices[i] - prices[i-1]原始数组的差值 ( ),并找到一个利润最大的连续子数组。如果差值低于 0,则将其重置为零。

maxCur = current maximum value

maxSoFar = maximum value found so far

class Solution {
    public int maxProfit(int[] prices) {
        int maxCur = 0, maxSofar = 0;
        for (int i = 1; i < prices.length; i++) {
            maxCur += prices[i] - prices[i - 1];
            maxCur = Math.max(0, maxCur);
            maxSofar = Math.max(maxSofar, maxCur);
        }
        return maxSofar;
    }
}

参考

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/discuss/39038/Kadane’s-Algorithm-Since-no-one-has-mentioned-about-this-so-far-%3A)-(In-case-if-interviewer-twists-the-input)

Read more

Java多线程学习总结(7)——创建线程池的正确姿势

Java多线程学习总结(7)——创建线程池的正确姿势

一、 通过Executors创建线程池的弊端 在创建线程池的时候,大部分人还是会选择使用Executors去创建。 下面是创建定长线程池(FixedThreadPool)的一个例子,严格来说,当使用如下代码创建线程池时,是不符合编程规范的。 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); 原因在于:(摘自阿里编码规约) 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors各个方法的弊端: 1)newFixedThreadPool和newSingleThreadExecutor:   主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。 2)newCachedThreadPool和newScheduledThreadPool:   主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。 二、 通过

By Ne0inhk
架构的缘起与目标

架构的缘起与目标

前言 在软件研发这个领域,程序员的终极目标都是想成为一名合格的架构师。然而梦想很美好,但现实却很曲折。在实际工作中,程序员会分很多种,有的擅长编码实现,有的擅长底层原理,有的擅长逻辑实现等等,在各自的领域都表现不俗、担当核心,然而,面临更高层架构设计时,很多优秀的程序员却折戟沙场,未能完成华丽转身。架构的真谛是什么呢?架构真的如此难把控吗?难道真的只有天资聪慧、天赋异能的程序员才能驾驭架构吗?不要气馁,平常心,其实人人都是架构师,可能你做的任一一件事已无形中用到了架构。本篇文章将带您慢慢走进架构,揭秘架构的真谛。正如,架构不是神秘物,吸取真谛即了然。 一、架构的背景 如果想要深入理解某一事物的本质,最好的方式就是去追寻这个事物出现的历史背景和推动因素。所以我们先来梳理一下软件开发的进化史,探索一下软件架构出现的历史背景。 1.1、机器语言 最早的软件开发使用的是“机器语言”,其直接使用二进制码0和1来表示机器可以识别的指令和数据。比如:为了完成“将寄存器 BX 的内容送到 AX 中”,机器语言如下: 1000100111011000

By Ne0inhk
实战:详解Spring创建bean的流程(图解+示例+源码)

实战:详解Spring创建bean的流程(图解+示例+源码)

概叙 这篇主要总结Spring中bean的创建过程,主要分为==加载bean信息–>实例化bean–>属性填充–>初始化阶段–>后置处理等步骤,且每个步骤Spring做的事情都很多,这块源码还是很值得我们都去看一看的。==而Spring中Bean的声明周期其实就是创建到使用到销毁,使用应该没啥需要说的,销毁在第三部分也正常介绍了三种销毁的方式。 如不想看文字,可以直接看后面的流程图。 什么是 Bean? 我们来看下 Spring Framework 的官方文档: In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean

By Ne0inhk
Linux学习总结(68)——Linux 30年专访:Linus Torvalds谈Linux内核开发与Git

Linux学习总结(68)——Linux 30年专访:Linus Torvalds谈Linux内核开发与Git

三十年前,当Linus Torvalds(林纳斯·托瓦兹,下文统称Linus)首次发布Linux内核时,他还是赫尔辛基大学(University of Helsinki)的一名21岁的学生,他宣布说:“我正在做一个(免费的)操作系统(只是个爱好,规模不大,也不怎么专业……)”。三十年后,前500强超级计算机、以及超过70%的智能手机全部都在运行Linux。显然,Linux的规模庞大,且十分专业。三十年来,Linus一直领导着Linux内核的开发,并为无数开发人员和开源项目提供了灵感和启发。在2005年,Linus还创建了Git来辅助管理内核开发过程,此后,它便成为了最受欢迎的版本控制系统,受到了无数开源和专利项目的信任。Linus通过电子邮件接受了记者的采访,反思了他这些年从领导大型开源项目中学到的东西。在本文的访谈内容中,重点讨论了Linux内核开发和Git。“[Linux]最初只是一个个人项目,并不是出于什么创造新的操作系统的伟大梦想,”Linus表示,“它只是由我对新PC硬件的深入学习而逐渐发展演变形成的。”关于创建Git并将其交给朱尼尔·哈马诺(Junio Hamano)来改进

By Ne0inhk