1. 程式人生 > >【劍指offer】面試題63:股票的最大利潤【C++版本】

【劍指offer】面試題63:股票的最大利潤【C++版本】

題目:

股票的最大利潤

假設把某股票的價格按照時間先後順序儲存在陣列中,請問買賣該股票一次可能獲得的最大利潤是多少?例如,一隻股票在某些時間節點的價格為{9,11,8,5,7,12,16,14}。如果我們能在價格為5的時候買入並在價格為16的時候賣出,則能收穫最大的利潤11。

解題思路:

1.可以轉換成為求最大子陣列問題,陣列相鄰的數後一個減去前一個減得到股票的變化陣列{2,-3,-3,2,5,4,-2}。這樣問題轉換成了求陣列的最大子陣列問題。
2.也可以在遍歷陣列時記錄下遍歷到某個節點能夠買入的最低價格,在當前價格確定的情況下,在最低價格買入能夠賺最多。這樣遍歷一次陣列就能得到結果,時間複雜度為O(n)。

【C++版本】

#include <iostream>
#include <vector>

using namespace std;

int main() {
    system("pause");
    return 0;
}

//
int MaxDiff(const int *numbers, unsigned length) {
    if (numbers == NULL || length < 2)return 0;

    int min = numbers[0];
    int resu = numbers[1] - min;

    for
(int i = 2; i != length; i++) { //檢查前一天的值是不是最小值,是就更新最小值 if (numbers[i-1] < min) { min = numbers[i-1]; } //當前時間賣出能賺到最多的錢嗎 if ((numbers[i] - min) > resu) { resu = numbers[i] - min; } } return resu; }

相關推薦

offer試題63股票利潤C++版本

題目: 股票的最大利潤 假設把某股票的價格按照時間先後順序儲存在陣列中,請問買賣該股票一次可能獲得的最大利潤是多少?例如,一隻股票在某些時間節點的價格為{9,11,8,5,7,12,16,14}。如果我們能在價格為5的時候買入並在價格為16的時候

offer試題10斐波那契數列

題目一:求斐波那契數列的第n項 寫一個函式,輸入n,求斐波那契(Fibonacci)數列的第n項。斐波那契數列的定義如下: 當n=0時,f(n)=0; 當n=1時,f(n)=1; 當n>1時,f(n)=f(n-1)+f(n-2); 從下往上計算,首先根據 f(0)和 f(

offer試題32從上到下列印二叉樹

題目一:不分行從上到下列印二叉樹 從上到下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印。 二叉樹節點的定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNo

offer試題9用兩個棧實現佇列

題目:用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式appendTail 和deleteHead ,分別完成在佇列尾部插入節點和在佇列頭部刪除節點的功能。 template <typename T> class CQueue { public: CQueue(vo

offer試題8二叉樹的下一個節點

題目:給定一顆二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中的節點除了有兩個分別指向左、右子節點的指標,還有一個指向父節點的指標。 二叉樹的節點定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode*

offer試題7重建二叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 二叉樹節點的定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; Binar

Java《Offer試題2替換空格

替換空格 題目描述:請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。 思路:建立StringBuffer物件,然後將StringBuffer物件轉成字串物件,接著呼叫字串物件的replace方法,將空格

Offer試題1賦值運算子函式

// 面試題1:賦值運算子函式 // 題目:如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。 class CMyString {        public:               CMyString(char* pData = nullptr);             

offer試題4二維陣列中的查詢

題目: 在一個二維陣列中,每一行都按照從左到右遞增的順序排列,每一列都按照從上到下遞增的順序排列。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 查詢規則:首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,則查詢過程結束;如果

offer》- 試題3陣列中重複的數字(java實現)

題目一:         在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是重複

Offer系列-試題25二叉樹中和為某一值的路徑

題目:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 思路: 程式碼: vector<vector&

offer試題25二叉樹中和為某一值的路徑

題目:輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。思路:用棧記錄路徑,sum記錄當前和。如果是葉結點,判斷sum是否等於target,如果等於則輸出。help的方法最後需要將棧頂彈出,sum

offer試題39 二叉樹的深度(java)

設計模式 博客 rgs 歷史 存在 復制 pri 取值 今天 摘要: 今天翻到了《劍指offer》面試題39,題目二中的解法二是在函數的參數列表中通過指針的方式進行傳值,而java是沒有指針的,所以函數要進行改造。然而我翻了下別人的java版本(我就想看看有什麽高大上的改造

offer試題43 n個骰子的點數 (java)

r+ nal ret 次循環 分而治之 源碼 ava 面試 ble 引言:寫這篇文章的初衷只是想做個筆記,因為這道題代碼量有點大,有點抽象,而書上並沒有詳細的註釋。為了加深印象和便於下次復習,做個記錄。 原題:把n個骰子扔到地上,所有骰子朝上一面的點數之後為s. 輸入n,打

offer試題五)--從尾到頭列印單鏈表

程式碼如下(遞迴實現): /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { *

Offer試題找出陣列中有3個出現一次的數字

題目 一個int陣列中有三個數字a、b、c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。 思路 由於3個數字出現一次,其他數字均出現兩次,因此可以得到n一定為奇數。 3個只出現一次的數字,他們的bit位肯定不可能全部相同,也就是說

Offer系列-試題39-2判斷一棵樹是否為平衡二叉樹

題目:判斷一棵樹是否為平衡二叉樹 思路:根據上一題的二叉樹的深度,在遞迴過程中加上識別符號,遞迴到當前節點,判斷當前子樹是不是一個平衡二叉樹,如果不是,就把識別符號置為false,返回識別符號即可。

Offer試題3及LeetCode中相似題目

本篇博文總結了《劍指Offer》面試題3:陣列中重複數字的幾種解法,以及LeetCode中與之相似的題目,旨在舉一反三能夠很好地解決這一類問題。 面試題3: 陣列中重複的數字 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。陣列中某些數

offer試題12 大數相加 實現任意兩個整數的加法

劍指offer面試題12  列印從1到最大的n位10進位制數 。陷阱在於  當輸入的n很大時,不管用int 或 long long 都會溢位。這個程式碼 劍指offer原始碼上已經給出。於此相關的題目是  定義一個函式,實現任意兩個整數的加法,因為沒有限定兩個數的大小範圍,

Offer試題43~45)

面試題43:n個骰子的點數 題目:把n個骰子仍在地上,所有骰子朝上一面的點數之和為s。輸入n,打印出s的所有可能的值出現的概念。 解法一:基於遞迴求骰子點數,時間效率不夠高 要想求出n個骰子的點數和,可以先把n個骰子分成兩堆:第一堆只有一個,另一堆有n-1