leetcode 121 股票買賣問題系列

描述:

給一些列數字,表示每條股票的價格,如果可以買賣一次(不能同一天買和賣),求最大利益(即差最大)。

其他三道問題是,如果能買賣無限次,買賣兩次,買賣k次。

題一:

實質是求后面一個數減前一個數的最大差值。

維護一個最小值,和當前最大值。只需遍歷一次,空間也是常數。

int maxProfit(vector<int>& prices) {if (prices.size() < 1)return 0;int min_ = prices[0];int ret = 0;for (int i = 1; i < prices.size(); i++) {ret = max(ret, prices[i] - min_);min_ = min(min_, prices[i]);}return ret;
}

題二:

只要是后一個數比前一個大,都增。

int maxProfit(vector<int>& prices) {if (prices.size() < 1)return 0;int ret = 0;for (int i = 0; i < prices.size() - 1; i++) {ret += max(prices[i + 1] - prices[i], 0);}return ret;
}

題三:

可進行兩次操作。

其中一個思路,可以關注分界點,可以枚舉分界點,求左右兩邊的最優操作,在LeetCode會超時,顯然,復雜度n^2。

思考下優化,我們可以計算每個點的最大值,左邊不用重復計算,每次分界點往左移,都像題一那樣計算最大值即可;

      而右邊,其實可以反向計算一遍,但是,右邊改成求最小值。

      最后加起來即可。

int maxProfit(vector<int>& prices) {int size = prices.size();if (size < 1)return 0;int* left = new int[size]{0};int* right = new int[size]{0};int ret = 0;int lmin = prices[0];int lmax = 0;for (int i = 1; i < size; i++) {lmax = max(lmax, prices[i] - lmin);left[i] = lmax;lmin = min(lmin, prices[i]);}int rmin = 0;int rmax = prices[size - 1];for (int i = size - 1; i >= 0; i--) {rmin = min(rmin, prices[i] - rmax);right[i] = -rmin;rmax = max(rmax, prices[i]);}for (int i = 0; i < size - 1; i++) {ret = max(ret, left[i] + right[i + 1]);}return max(ret, left[size - 1]);
}

思路二:

int maxProfit(vector<int>& prices) {int n = prices.size();if(n==0) return 0;int sell1 = 0, sell2 = 0, buy1 = INT_MIN, buy2 = INT_MIN;for(int i =0; i<n; i++){buy1 = max(buy1, -prices[i]);sell1 = max(sell1, prices[i]+buy1);buy2 = max(buy2, sell1-prices[i]);sell2 = max(sell2, prices[i]+buy2);}        return sell2;        
}

題四:

動態規劃:

其中diff表示今天和昨天的差。

global[i][j] = max(local[i][j], global[i-1][j])

local[i][j] = max(global[i-1][j-1] + max(diff,0), local[i-1][j] + diff)

?

local[i][j]表示最后一次賣出在今天的最大利益,局部最優。

global[i][j]表示全局最優。

第一條式子:要么在今天賣出最優,要么前一天的全局最優。

第二條式子:前者為之前的全局最優加上最后一次交易在今天。

        注意diff,我們要的是不大于j的交易次數;

        如果i - 1天還持有,則i天賣出,共j - 1次操作;如果i-1天不持有,則i - 1天買入,i天賣出,共j次操作。

      后者為i - 1天賣出加上今天diff,表示i - 1天還持有,加上今天的。

int maxProfit(int k, vector<int>& prices) {  if (prices.size() < 2) return 0;  int days = prices.size();  if (k >= days) return maxProfit2(prices);auto local = vector<vector<int> >(days, vector<int>(k + 1));auto global = vector<vector<int> >(days, vector<int>(k + 1));for (int i = 1; i < days ; i++) {int diff = prices[i] - prices[i - 1];  for (int j = 1; j <= k; j++) {  local[i][j] = max(global[i - 1][j - 1], local[i - 1][j] + diff);  global[i][j] = max(global[i - 1][j], local[i][j]);  }  }  return global[days - 1][k];  
}  int maxProfit2(vector<int>& prices) {  int maxProfit = 0;  for (int i = 1; i < prices.size(); i++) {  if (prices[i] > prices[i - 1]) {  maxProfit += prices[i] - prices[i - 1];  }  }  return maxProfit;  
} 

類似題三的做法:

int maxProfit(int k, vector<int>& prices) {int n = prices.size();if(k>n/2){int buy = INT_MIN, sell = 0;for(int i=0; i<n; i++){buy = max(buy, sell-prices[i]);sell = max(sell, buy+prices[i]);}return sell;}vector<int> sell(k+1, 0);vector<int> buy(k+1, 0);for(int i=0; i<=k; i++) buy[i] = INT_MIN;for(int i=0; i<n; i++){for(int j=1; j<k+1; j++){buy[j] = max(buy[j], sell[j-1]-prices[i]);sell[j] = max(sell[j], buy[j]+prices[i]);}}return sell[k];        
}

?

轉載于:https://www.cnblogs.com/willaty/p/8304914.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539605.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mybatis-jar-lib

csdn的下載好像和我有仇&#xff0c;上傳資源不斷提示&#xff1a;請您先登錄 下載&#xff1a;http://pan.baidu.com/s/1pL2BAzT asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1.1.jar mybatis-3.1.1.jar ----以上mybatis的--- log4j-1.2.16.jar ----以上log4j日志--…

java使用隊列實現棧思路_算法面試:隊列實現棧的方案

聲明&#xff1a;碼字不易&#xff0c;轉載請注明出處&#xff0c;歡迎文章下方討論交流。前言&#xff1a;Java數據結構與算法專題會不定時更新&#xff0c;歡迎各位讀者監督。本篇介紹的是如何用兩個隊列實現棧的問題。這道題作為上一篇文章算法面試&#xff1a;棧實現隊列的…

Uber如何使用go語言創建高效的查詢服務

在2015年初我們創建了一個微服務&#xff0c;它只做一件事&#xff08;也確實做得很好&#xff09;就是地理圍欄查詢。一年后它成了Uber高頻查詢&#xff08;QPS&#xff09;服務&#xff0c;本次要講的故事就是我們為什么創建這個服務&#xff0c;以及編程語言新秀Go如何幫我們…

centos7:塔建pure_ftpd虛擬用戶

2019獨角獸企業重金招聘Python工程師標準>>> 1.下載pure_ftpd&#xff0c;上傳服務器,目錄路徑:/usr/local/src/ 下載地址:https://pan.baidu.com/s/1kWe8FAn 2.安裝pure_ftpd cd /usr/local/srctar -xjf pure-ftpd-1.0.36.tar.bz2cd pure-ftpd-1.0.36./configure -…

java.lang.module_如何修復“java.lang.module.FindException:module java.se.ee not found”錯誤

我正在嘗試打包我的kivy應用程序(python3)&#xff0c;但是當我運行命令buildozer -v android debug時&#xff0c;看到這個錯誤# Cwd /home/javier/.buildozer/android/platform/android-sdkError occurred during initialization of boot layerjava.lang.module.FindExceptio…

寒武紀芯片——有自己的SDK,支持tf、caffe、MXNet

寒武紀芯片產品中心>智能處理器IP智能處理器IP MLU智能芯片 軟件開發環境 Cambricon-1A 高性能硬件架構及軟件支持兼容Caffe、Tensorflow、MXnet等主流AI開發平臺&#xff0c;已多次成功流片 國際上首個成功商用的深度學習處理器IP產品&#xff0c;可廣泛應用于計算機視覺、…

maven ssm框架 mysql_SSM框架(IDEA+Spring+SpringMVC+Maven+Mybatis+MySQL)

【實例簡介】SSM框架(IDEASpringSpringMVCMavenMybatisMySQL),搭建SSM框架&#xff0c;利用mybatis-plus插件自動生成數據庫相關代碼。【實例截圖】【核心代碼】0d399d99-f108-4aaa-9c81-35b505c86e8a└── SSMManager├── pom.xml├── sql│ └── test.sql└── src…

spring框架的引入

spring框架給程序開發帶來了春天&#xff0c;在很多項目里&#xff0c;可能不用struts&#xff0c;不用hibernate&#xff0c;但往往都有spring。 why&#xff1f; 因為每個項目都會涉及到對象的創建和對象之間的依賴。 一、傳統的MVC開發 mvc的項目框架結構&#xff1a;Enti…

Java編程作業體會_Java作業的幾點總結感想

本次博客主要是總結近幾次作業&#xff0c;交流一下自己的感受。本次作業主要是對近幾次Java課程的鞏固作業&#xff0c;第一次作業主要是一些基礎的題目&#xff0c;包括選擇循環等一些基本語句&#xff0c;其目的在于掌握java一些基本知識&#xff0c;感受出Java與其他語言有…

基于百度語音識別API的Python語音識別小程序

一、功能概述 實現語音為文字&#xff0c;可以擴展到多種場景進行工作&#xff0c;這里只實現其基本的語言接收及轉換功能。 在語言錄入時&#xff0c;根據語言內容的多少與停頓時間&#xff0c;自動截取音頻進行轉換。 工作示例&#xff1a; 二、軟件環境 操作系統&#xff1a…

spring專業術語了解

組件/框架設計 侵入式設計 引入了框架&#xff0c;對現有的類的結構有影響&#xff1b;即需要實現或繼承某些特定類。 例如&#xff1a;Struts框架 非侵入式設計 引入了框架&#xff0c;對現有的類結構沒有影響。 例如&#xff1a;Hibernate框架 / Spring框架 控制反轉: In…

java修改ldap用戶密碼_LDAP 用戶更改自己的密碼

LDAP中采用了ACL的權限控制。在/etc/openldap/slapd.conf文件中&#xff1a;## See slapd.conf(5) for details on configuration options.# This file should NOT be world readable.#include/etc/openldap/schema/corba.schemainclude/etc/openldap/schema/core.schemainclud…

Spring第三篇【Core模塊之對象依賴】

tags: Spring 前言 在Spring的第二篇中主要講解了Spring Core模塊的使用IOC容器創建對象的問題&#xff0c;Spring Core模塊主要是解決對象的創建和對象之間的依賴關系&#xff0c;因此本博文主要講解如何使用IOC容器來解決對象之間的依賴關系&#xff01; 回顧以前對象依賴 我…

spring框架結構介紹

Spring提供了一站式解決方案&#xff1a; 1&#xff09; Spring Core spring的核心功能&#xff1a; IOC容器, 解決對象創建及依賴關系 2&#xff09; Spring Web Spring對web模塊的支持。 -->可以與struts整合,讓struts的action創建交給spring -->spring mvc模式 3…

java通過J2C獲取用戶名密碼_WAS服務器上的J2C別名有什么用途?

這是我LdapTemplate類 公共LdapTemplate getLdapTemplete(字符串ldapID) {WAS服務器上的J2C別名有什么用途&#xff1f;if (ldapID.equalsIgnoreCase(Constants.LDAP1)){if (ldapTemplate1 null){try{PasswordCredential passwordCredential j2cAliasUtility.getAliasDetails…

百度坐標轉換API使用

http://api.map.baidu.com/geoconv/v1/?coords121.54759,29.870724&from1&to5&aksGSOaO07WkRHHiCRxxbSQVBn 前提&#xff1a;121.54759,29.870724 是由手機硬件或谷歌地圖獲取的 錯誤的方法一&#xff1a; function standard2china(lng,lat){//http://api.map.ba…

Java語言所有異常類均繼承自_Java將運行錯誤分為兩類:(__)和(__), 其對應的類均派生自(__)類;...

【單選題】設 x,y 均為已定義的類名,下列聲明對象x1的語句中正確的是( )【判斷題】構造函數的方法名可以由編程人員任意命名。【單選題】能夠實現對原文的鑒別和不可否認性的認證技術是( )。【單選題】設有定義語句int a[]{66,88,99}; 則以下對此語句的敘述錯誤的是( )。【判斷…

Quartz業務類無法注入Spring對象問題

tags: 解決錯誤, titile: Quartz業務類無法注入Spring對象問題 Quartz業務類無法注入Spring對象問題 在剛開始遇到的時候還以為是Spring配置哪里錯誤了&#xff0c;結果搞了那么久&#xff0c;才知道Quartz與Spring注入對象是不關聯的。。 因為Quartz的業務Job對象是由Quartz來…

如何解決ajax跨域問題

原文&#xff1a;http://www.congmo.net/blog/2012/06/27/ajax-cross-domain/ 跨域問題 起 因是這樣的&#xff0c;為了復用&#xff0c;減少重復開發&#xff0c;單獨開發了一個用戶權限管理系統&#xff0c;共其他系統獲取認證與授權信息&#xff0c;暫且稱之為A系統&#xf…

spring bean創建細節

1) 對象創建&#xff1a; 單例/多例 scope"singleton", 默認值&#xff0c;即默認是單例【service/dao/工具類】 scope"prototype", 多例&#xff1b;【Action對象】 2) 什么時候創建? scope"prototype" 在用到對象的時候&#xff0c…