說你有一個數組,其中第i個元素是第i天給定股票的價格。設計一個演算法來找到最大的利潤,最多可以完成兩個交易。
用四個變數來表示倆次交易的買入賣出,遍歷陣列,比較每次交易的利益,儲存最大的。
2 左右掃描 分別計算出 i 之前 pre[]和 之後 post[] 的最大利潤 ,在 i 處為分割 求出最大交易int maxProfit(vector<int> &prices) { int len=prices.size(); if(len==0) return 0; int buy1=INT_MIN; int sell1=0; int buy2=INT_MIN; int sell2=0; //表示經過當前操作後的最大profit for(int i=0;i<len;i++){ buy1=max(buy1,-prices[i]); sell1=max(sell1,buy1+prices[i]); buy2=max(buy2,sell1-prices[i]); sell2=max(sell2,buy2+prices[i]); } return sell2; }
int maxProfit(vector<int> &prices) { int len=prices.size(); if(len==0) return 0; vector<int> pre(len); vector<int> post(len); int minPrice=prices[0]; // pre[0]=prices[0]; for(int i=1;i<len;i++){ minPrice=min(minPrice,prices[i]); pre[i]=max(pre[i-1],prices[i]-minPrice); } int maxPrice=prices[len-1]; // post[len-1]=prices[len-1]; for(int i=len-2;i>=0;i--){ maxPrice=max(maxPrice,prices[i]); post[i]=max(post[i+1],maxPrice-prices[i]); } int maxProfit=0; for(int i=0;i<len;i++){ maxProfit=max(maxProfit,pre[i]+post[i]); } return maxProfit; }
如果不限交易次數 則 遍歷陣列
int maxProfit(vector<int> &prices) { int len=prices.size(); if(len==0||len==1) return 0; int profit=0; for(int i=1;i<len;i++){ int sum=prices[i]-prices[i-1]; if(sum>0) profit+=sum; } return profit; }
------------------------------------------------------------
如果只可以交易一次,則找出差值最大的即可
int maxProfit(vector<int> &prices) {
int len=prices.size();
if(len==0||len==1)
return 0;
int maxProfit=0;
for(int i=0;i<len-1;i++){
int price=prices[i];
for(int j=i+1;j<len;j++){
int profit=prices[j]-price;
if(profit>maxProfit){
maxProfit=profit;
}
}
}
return maxProfit;
}
解2:
int maxProfit(vector<int> &prices) {
int len=prices.size();
if(len==0||len==1)
return 0;
int maxProfit=0;
int minPrice=prices[0];
for(int i=1;i<len;i++){
minPrice=min(minPrice,prices[i]); //找出最低價格
maxProfit=max(maxProfit,prices[i]-minPrice); //計算最大差值
}
return maxProfit;
}
相關推薦
說你有一個數組,其中第i個元素是第i天給定股票的價格。設計一個演算法來找到最大的利潤,最多可以完成兩個交易。
用四個變數來表示倆次交易的買入賣出,遍歷陣列,比較每次交易的利益,儲存最大的。 int maxProfit(vector<int> &prices) { int len=prices.size(); if(len
有一個數組,由正整數、負整數、零組成,求和最大的連續子陣列
$arr = [-11,1,111,-120,1,1,1,-55,-1,21,-1,1,1,1,1,-55,-1,130,1,1,-1]; // 歷史最大 $log_arr = [ 'start_item' => 0, 'value' => 0, 'end
設計一個getMin功能的棧,如果面試官讓你寫一個數組類,一定不要用指標去管理new出來原生的陣列,那就是在給自己挖坑
//設計實現一個getMin功能的棧 #include <iostream> #include <stack> using namespace std; class GetMinStack { public: void push(int x)
每天一道LeetCode-----買賣商品問題,計算最大利潤,分別有一次交易,兩次交易,多次交易的情況
Best Time to Buy and Sell Stock 給定一個價格序列prices,其中prices[i]代表第i天商品的價格,商家需要在某一天買入,然後在之後的某一天出售,計算可以獲得的最大利潤 本質就是計算prices[i]−price
Java總雜湊表的運用,判斷一個數組中是否存在相同的元素之間的距離在k以內!
Check if a given array contains duplicate elements within k distance from each other 用雜湊表,複雜度O(n),
如何消除一個數組裏面重復的元素?
前端入門 初級前端 // 方法一:var arr1 =[1,2,2,2,3,3,3,4,5,6],arr2 = [];for(var i = 0,len = arr1.length; i< len; i++){if(arr2.indexOf(arr1[i]) < 0){arr2.push(
js簡單演算法(二)如何去除一個數組中與另一個數組中的值相同的元素
codewars上面6kyu的演算法題,下面是演算法題的英文簡介 Your goal in this kata is to implement an difference function, which subtracts one list from another. I
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多只允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。
pan stat 給定 arr 註意 turn 大於 交易 nbsp 給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多只允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。 註意你不能在買入股票前賣出股票。 示例 1
給你一個數組,你怎麼模擬出A陣列的第一個元素,B第二個元素。。。以此類推。
choiceoptinfo:["<p>6時30分</p>", "<p>6時50分</p>", "<p>6時</p>"] 有這樣一個數組。他是一個題目的選項。 我們要寫成下面這個圖片的樣式。字數比較少的時候,一行兩
給定一個數組 nums,有一個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。 返回滑動視窗最大值。
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums == null || nums.length == 0) return new int[0];
面試題:給定一個數組,陣列中只包含0和1。請找到一個最長的子序列,其中0和1的數量是相同的
這個題目,看起來比較簡單,一些同學可能認為題目的描述符合動態規劃的特徵,然後就開始用動態規劃解,努力找狀態轉移方程。這些同學的感覺,是很正確的。但,找狀態轉移方程,我們要對原來的陣列進行變換一下。 原來是0和1的串,我們將0都換為-1。這樣題目目標就變成,找到一個最長的子串,子串數字和是0。設原陣列為A
php 通過curl獲取遠程數據,返回的是一個數組型的字符串,高手幫忙如何將這個數組類型的字符串變成數組。
bsp 選項 con 獲取 pan 如果 clas exe transfer 如 Array([0] => Array([0] => Array([kd_status] => 已簽收[kd_time] => 2014-04-30 18:59:43 [
Codeforces Round #283 (Div. 2) A. Minimum Difficulty【一個數組定義困難值是兩個相鄰元素之間差的最大值。 給一個數組,可以去掉任意一個元素,問剩余數列的困難值的最小值是多少】
分析 options force minimum sta cif als 最小 技術分享 A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 mega
給定一個數組,找出其中出現奇數次的元素
package com.yzcl.test; public class JiShu { public static void main(String[] args) { //給定一個含有n個元素的整型陣列a,例如{1,1,2,4,3,3,1},找出其中出現奇數次的元素,並列印,輸出:1,
給定一個數組,其中只有一個數出現一次,別的數都出現3次,找出這個數(go)
1.思路 用兩個數one=0、two=0分別記錄bits位上1出現的次數,如果一個數出現一次,則one等於這個數,two=0; 如果一個數出現兩次,則two等於這個數, one等於0;如果一個數出現第三次,則one = 0, two = 0 ,three等於這個數。 我們以陣
往一個數組物件裡面傳值,如果id已經存在就替換id同一個物件裡面的另一個值。沒有就新增
<div @click='choiceAnswer1(item ,keyindex)' v-for="(item,keyindex) in arrayData">{{item}}</div> choiceAnswer1(d
給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法
題目描述 給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 /* 思路:題目要求B的i個元素等於A中除了i個元素所以元素乘積 因此思路很清
給定一個數組和一個數(該數不一定在陣列中),從數組裡刪掉這個數字,返回剩下的陣列長度。
給定一個數組和一個數(該數不一定在陣列中),從數組裡刪掉這個數字,返回剩下的陣列長度。 如:A[] = {1, 2, 3, 4, 5}要刪除數字 3,那麼返回陣列長度為 4。 親愛的小夥伴們,題目是不是很簡單呢? 提示:int removeElement(int
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。
題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。 /*
一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。
1.一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 #include<stdio.h> #include<stdio.h> int main() { int arr[] = { 1, 3, 8, 1,