范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

买卖股票的最佳时机(多解法)

  普通暴力解public int maxProfit(int[] prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0]>=prices[1])) {         return 0;     }     int ans = 0;     for (int i = 0; i < prices.length - 1; i++) {         for (int j = i + 1; j < prices.length; j++) {             if (prices[j] > prices[i]) {                 ans = Math.max(ans, prices[j] - prices[i]);             }         }     }     return ans; }暴力递归解public int maxProfit(int[] prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0]>=prices[1])) {         return 0;     }     return process(prices, 0, -1, -1); } public int process(int[] prices, int i, int buyDay, int sellDay) {     if (prices.length == i) {         if (buyDay > -1 && buyDay < sellDay && prices[buyDay] < prices[sellDay]) {             return prices[sellDay] - prices[buyDay];         }         return 0;     }     // 在第i天不操作     int p0 = process(prices, i + 1, buyDay, sellDay);     // 在第i天买入     int p1 = 0;     if (buyDay == -1 && sellDay == -1) {         p1 = process(prices, i + 1, i, sellDay);     }     // 在第i天卖出     int p2 = 0;     if (buyDay > -1 && sellDay == -1) {         p2 = prices[i] > prices[buyDay] ? prices[i] - prices[buyDay] : 0;     }     return Math.max(p0, Math.max(p1, p2)); }
  另一种暴力递归可推导出动态规划:public int maxProfit(int[] prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0]>=prices[1])) {         return 0;     }     return process(prices, 0, 0); } public int process(int[] prices, int i, int flag) {     // base case     if (i == 0) {         if (flag == 0) {             return 0;         }         return -prices[0];     }     if (flag == 0) { // 第i天不持有股票         return Math.max(process(prices, i - 1, 1) + prices[i], process(prices, i - 1, 0));     } else {         return Math.max(process(prices, i - 1, 1), -prices[i]);     } }动态规划解
  public int maxProfit(int[] prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0]>=prices[1])) {         return 0;     }     int len = prices.length;     // dp[i][0] 下标为 i 这天结束的时候,不持股,手上拥有的现金数     // dp[i][1] 下标为 i 这天结束的时候,持股,手上拥有的现金数     int[][] dp = new int[len][2];     // 初始化:不持股显然为 0,持股就需要减去第 1 天(下标为 0)的股价     dp[0][0] = 0;     dp[0][1] = -prices[0];     // 从第 2 天开始遍历     for (int i = 1; i < len; i++) {         dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);         dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);     }     return dp[len - 1][0]; }
  在暴力递归的基础上加缓存,转变成记忆化搜索:
  最终版的动态规划是怎么写出来的呢?请看下图:
  单调栈解
  public int maxProfit(int[] prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0]>=prices[1])) {         return 0;     }     int ans = 0;     //int min = 0;     //Stack upStack = new Stack();     int topIndex = -1; // 记录栈顶下标     int[] upStack = new int[prices.length];          for (int i = 0; i < prices.length; i++) {         // 由小到大的单调栈         //while (!upStack.empty() && upStack.peek() > prices[i]) {         while (topIndex > -1 && upStack[topIndex] > prices[i]) {             //int p = upStack.pop();             int p = upStack[topIndex--];             int min = upStack[0];             if (p > min) {                 ans = Math.max(ans, p - min);             }         }         /*if (upStack.empty()) {             min = prices[i];         }*/         //upStack.push(prices[i]);         upStack[++topIndex] = prices[i];     }     // 栈顶元素未被处理     //if (upStack.size() > 1) {     if (topIndex > 0) {         //int p = upStack.pop();         int p = upStack[topIndex--];         int min = upStack[0];                  if (p > min) {             ans = Math.max(ans, p - min);         }     }     return ans; }
  直接使用 java.util.Stack 会对性能会造成影响,因此这里利用数组来优化。滑动窗口解public int maxProfit(int[] prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0]>=prices[1])) {         return 0;     }     // minWindow 由小到大     LinkedList minWindow = new LinkedList();     for (int R = 0; R < prices.length; R++) {         while (!minWindow.isEmpty() && prices[minWindow.peekLast()] >= prices[R]) {             minWindow.pollLast();         }         minWindow.addLast(R);         int buyPrice = prices[minWindow.peekFirst()];         int sellPrice = prices[R];         if (sellPrice > buyPrice) {             ans = Math.max(ans, sellPrice - buyPrice);         }     }     return ans; }线段树解
  public int maxProfit(int... prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0] >= prices[1])) {         return 0;     }     int ans = 0;     SegmentTree segmentTree = new SegmentTree(prices);     for (int i = 0; i < prices.length; ++i) {         int buyPrice = prices[i];         int sellPrice = segmentTree.query(i + 1, prices.length, 1, prices.length, 1);         ans = Math.max(ans, sellPrice - buyPrice);     }     return ans; } public class SegmentTree {     private int[] data;     private int[] max;     public SegmentTree(int[] src) {         int N = src.length + 1;         data = src;         max = new int[N << 2];         build(1, N - 1, 1);     }     private void pushUp(int i) {         max[i] = Math.max(max[i << 1], max[i << 1 | 1]);     }     private void pushDown(int i) {     }     private void build(int l, int r, int i) {         if (l == r) {             max[i] = data[l - 1];             return;         }         int mid = (l + r) >> 1;         build(l, mid, i << 1);         build(mid + 1, r, i << 1 | 1);         pushUp(i);     }     public int query(int L, int R, int l, int r, int i) {         if (L <= l && r <= R) {             return max[i];         }         int mid = (l + r) >> 1;         pushDown(i);         int left = 0;         int right = 0;         if (L <= mid) {             left = query(L, R, l, mid, i << 1);         }         if (R > mid) {             right = query(L, R, mid + 1, r, i << 1 | 1);         }         return Math.max(left, right);     } }树状数组解
  public int maxProfit(int[] prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0]>=prices[1])) {         return 0;     }     int ans = 0;     IndexTree indexTree = new IndexTree(prices.length);     for (int i = 0; i < prices.length; i++) {         indexTree.set(i + 1, prices[i]);     }     for (int i = 1; i < prices.length; i++) {         int min = indexTree.min(i + 1);         if (prices[i] > min) {             ans = Math.max(ans, prices[i] - min);         }     }     return ans; } public static class IndexTree {     private int[] tree;     private int N;     // 0位置弃而不用     public IndexTree(int size) {         N = size;         tree = new int[N + 1];         for (int i = 1; i <= N; i++) {             tree[i] = Integer.MAX_VALUE;         }     }     // 返回 [1, index] 范围最小值     public int min(int index) {         int ret = Integer.MAX_VALUE;         while (index > 0) {             ret = Math.min(tree[index], ret);             index -= index & -index;         }         return ret;     }     // index & -index : 提取出index最右侧的1出来     // 假设 index 为   : 0011001000     // index & -index : 0000001000     public void set(int index, int v) {         while (index <= N) {             tree[index] = Math.min(tree[index], v);             index += index & -index;         }     } }最优解public int maxProfit(int[] prices) {     if (null == prices || prices.length < 2 || (prices.length == 2 && prices[0]>=prices[1])) {         return 0;     }     int ans = 0;     int minPre = prices[0];     for (int i = 1; i < prices.length; i++) {         if (prices[i] > minPre) {             ans = Math.max(ans, prices[i] - minPre);         } else {             minPre = prices[i];         }     }     return ans; }
  以上花式炫技,你学废了吗?

这4名国家一级演员被永久除名,原因令人唏嘘说起国家一级演员这个称号,可以说是演员们一生的追求,在我们普通人的潜意识里,要想获得此称号不仅仅演技精湛,且品性极其端正才能行,但是今天我们要说的这四位演员却与该言论背道而驰。大家停电海啸恐将至!2000万美国家庭无力支付电费账单据央视援引外媒消息称,美国全国约2000万户家庭拖欠水电费,约占美国家庭总数的六分之一。据美国国家能源援助主任协会(NEADA)的说法,这是该数据有记录以来达到的最严重的水平。拖欠旅游专家分享秘密游轮设有牢房和太平间游轮上设有牢房和太平间相较于搭乘飞机或火车,一般人搭乘游轮的机会比较少,所以可能不知道游轮上有哪些设施。最近有旅游专家透露,除了多种游乐设施之外,游轮还设有牢房和太平间(停尸房),中国男篮战强敌12人名单出炉!新疆签NBA2米26中锋山西内线遭哄抢北京时间8月25日晚22点,中国男篮将迎来世预赛第四阶段的首个对手哈萨克斯坦,该队目前亚洲排名第九,仅落后中国男篮一位,近年来进步有目共睹,尤其是内线球员不惜力的冲抢篮板球,让中国新疆签凯尔特人中锋,媒体人暗示蔡崇信或签张镇麟,中韩男篮争霸新疆签2米26NBA球星今年夏天,新疆男篮无论是本土球员还是外援的引援动作都非常的大,他们引进了本土球星朱旭航,小外援签约了皮埃尔杰克逊,大外援则续约了摩尔特里。8月24日据知名篮CBA新赛季六队具备争冠实力,辽粤底蕴依在,新疆成最大搅局者万众瞩目的CBA联赛将于10月10日拉开大幕,从目前情况来看20支球队在本土球员以及外援的引进上都已接近尾声,新赛季最大特点将是群雄逐鹿场面,毕竟辽粤经过巨变将不再是一家独大,这也官宣!新疆签约CBA大杀器,王化东离队,辽宁双子星重回大名单北京时间的8月25日,中国男篮目前正在哈萨克斯坦进行备战,而今天晚上就将迎来世界杯预选赛的第一场比赛,虽然这几天没有精彩的比赛,但中国男篮还是传来了很多新的消息,笔者也是整理了一番秋天,我来到山上诗词里的浪漫网图侵删秋天,我来到山上路边的花草迎着清凉的微风热情地点头摇晃树枝上的火荆果一串串等着人们去品尝那林荫伞盖下的小溪也在唱着叮咚的歌儿洌洌地流向远方秋天,我来到山上听见牧转骨趁秋天,个子猛一窜,抓住黄金期,常吃5道菜,个头猛长老人常说转骨趁秋天,个子猛一窜,万物的生长都有规律,秋天不光是收获的季节,更是孩子骨骼发育高速增长的黄金期,立秋之后,家长要抓住孩子生长发育的黄金期。长个子的时候一定要让孩子摄入充曝新疆男篮同科塔法尔签约一年身高2米26曾效力绿军骑士北京时间8月25日,据知名记者Shams报道,新疆男篮已经同科塔法尔签下了为期一年的合同,科塔法尔曾经在NBA的凯尔特人和骑士这两队效力。科塔法尔出生于1995年12月10日,目前无论煎什么鱼?直接倒油去煎就废了,多加1步,鱼香酥不掉皮煎鱼是我们日常生活中非常喜欢吃的一道美食,夏天的时候吃鱼比较多一些,因为它的蛋白质含量非常高,而脂肪含量低,所以含有优质的蛋白,无论是老人还是孩子,都特别喜欢吃,在家煎鱼的话容易出家庭版炒年糕,巨好吃!比外面卖的还好吃年糕这样炒,既简单又好吃,我是天天都吃不腻!做法超简单!喜欢的朋友一起来试试吧食材年糕鸡蛋火腿肠香菇青菜调料葱蒜盐生抽老抽蚝油白糖香菇火腿肠鸡蛋年糕做法鲜香菇火腿肠年糕切片,鸡蛋打泡椒凤爪配方学会直接开店正宗四川泡椒凤爪配方以一斤冷冻鸡爪计算备料冷冻鸡爪小米椒白醋鸡精味精盐白糖姜食品级双氧水小红朝天椒白萝卜大蒜头香料香叶小茴香花椒三奈桂皮八角草果做法一,主料处理b把买回来的冷冻鸡爪终于官宣!索尼PSVR2全解析索尼本周通过社交媒体确认了其备受期待的PSVR2头显的正式发布窗口。该公司昨天早上在TwitterFacebook和微博上发布了一张图片,宣布下一代控制台VR头显的发布日期2023智能手机上的功能键很好用,但迟早要被抛弃为了一个小功能,额外增加一个物理按键,值不值得?努比亚的产品经理在发布Z40SPro的时候表示,每个手机都值得一个静音键。另一边,静音滑块键作为一加手机的标志性设计,从去年开始部分三星GalaxyZFlip4登场即领潮,颜值与体验万里挑一移动互联网时代,智能手机对人们的生活影响巨大。伴随折叠屏手机的兴起,当代年轻人对折叠屏手机的需求程度与日俱增。8月22日,三星Galaxy新品中国发布会如期而至,备受众多Z世代期待小小诺娅乐园继承者游戏评测小小诺娅,逆天改命大家好,这里是雪落,很高兴为大家带来小小诺娅的游戏评测。基本信息名称小小诺娅乐园继承者(LittleNoahScionofParadise)类型标签横板动作,roguelite,日巧妙取舍有门道,探月轨道知多少近日,美国宇航局发射了阿尔忒弥斯计划框架下的首颗探月卫星,它在飞行途中一度失联,引发关注。其实,航天器选择的探月轨道种类不少,各有优势,可以满足不同的任务需求。随着人类对月球探测开普通家庭实现财务自由三步骤首先回答问题普通家庭有实现财务自由的可能性吗?答完全有可能。但任何目标的达成非轻而易举,都会有相应过程的步骤。底图为哈尔滨音乐公园普通家庭财务自由三步骤1。保持财务平衡即收入支出,受全球高温干旱天气影响,美国一条河流发现1亿年前恐龙足迹近段时间以来,全球高温天气不断,光是我国很多地方温度都超过了4摄氏度。全国各地也同时也现了很多旱灾,许多历史古迹也在高温天气中暴露无余。同样受到干旱影响的还有美国,更是在一条河流中签约达成!顺利回归,跟随詹姆斯赢下两连冠,降薪的钱你都拿到了看过此前一个统计,在NBA联盟当中,所有为NBA效力过的球员平均在这个联盟中待的时间大概是4年,除了那些球迷耳熟能详的球星或者是一些非常优质的角色球员可以打10年以上,更多的一些低杨健离职之后,曝洪钢也已离开央视,体育实力名嘴所剩无几2022年羽毛球世锦赛今天在日本东京正式开赛。某互联网平台拥有转播权,邀请了林丹高崚李雪芮蔡赟鲍春来等名将组成冠军解说天团而在转播名单上,我们还看到了昔日央视资深解说员洪钢的名字。
联想拯救者Y900即将亮相,14。5寸机皇平板近日,联想拯救者正式官宣,性能狂飙,高能体验!3月21日1900,拯救者携全新2023生态新品震撼来袭。随着发布活动时间的逐渐接近,联想拯救者官方也陆续宣布了即将于活动中到来的产品不装了?阿里真面目暴露,人民日报说得很对过去两三年时间里,受蚂蚁集团上市风波以及社区团购卖菜业务的舆论影响,导致很多人对阿里巴巴的印象并不好,就连马云也被网友喷的体无完肤,把过去马爸爸的称呼改成了吸血鬼。但是要知道,马云华为员工年薪收入表出来了,你能否接受这种高薪?华为员工年薪收入表出来了,你能否接受这种高薪?华为作为国内知名手机品牌,其员工的高收入一直备受关注。近日,华为员工年薪收入表也在网络上流传开来,让人们看到了这家公司对于员工的福利待纯净版Windows将成过去,微软官方广告全家桶加载完毕和此前宣布的一致,IE浏览器终于算是彻底走到了尽头。上周微软通过MicrosoftEdge更新彻底禁用了已宣布退役的IE浏览器。曾凭借IE让微软一度占据了96的浏览器市场份额,而现中国移动5G亚运之队启动亚洲飞人苏炳添成首位成员中国移动5G亚运之队首位成员苏炳添出席活动。主办方供图中国青年报客户端杭州3月21日电(中青报中青网记者梁璇)中国移动321春分计划暨5G亚运之队今天在杭州奥林匹克体育中心启动。作我们是世界上网民人数最多的国家,人多就一定是好事吗?我们是世界上网民人数最多的国家,截止2022年12月,我国网民规模达到10。67亿,互联网普及率高达75。6。短视频用户规模首次突破十亿,用户使用率高达94。8。又听到了来官方的权王者荣耀哪个英雄消耗能力最强?消耗排行榜来了!王者荣耀中,非常常见的就是打消耗战,在对局失利的时候,这些拥有着消耗技能的英雄至关重要,往往靠着这些英雄慢慢消磨对手的血量让败局进展缓慢,从而使局势慢慢拉平,甚至反败为胜。消耗王第华为乌江突围取得重大进展,突破乌江天险,彻底摆脱西方制裁以前觉得华为就是赚情怀钱,现在才知道,它配得上这名字,中国独此一家。虽然很多人在黑华为,但华为依然活得好好的。依然每年增加科研经费,依然不断进步。有种打不死我,我就气死你的架势。这质押的虚拟货币被转走,原来是投资项目有后门今晚九点半为吸引投资者将手中的虚拟货币质押在自己的区块链项目里李某开发两套代码为犯罪留后门造成多位投资人经济损失达3800万元后李某为自己的贪心付出了代价为吸引投资者将手中的虚拟货币质押在自江发置业发展推介会举行,三大开发项目案名发布南都讯为进一步擦亮江发地产品牌,焕新侨都美好人居,助力江门市房地产行业高质量发展,3月21日,江门市和兴置业发展有限公司(以下简称置业发展)在万达嘉华酒店举行云程发轫不负春光江发置全球电商巨头的至暗时刻作者丨欧雪编辑丨孙超逸图源丨图虫做得更少,但做得更好(Doless,butdoitbetter)。东南亚电商平台Shopee母公司Sea联合创始人董事长兼CEO李小冬在2022年年