演算法程式設計(三)

2021-07-30 08:04:25 字數 4797 閱讀 3250

一、請使用棧,設計乙個資料結構,它具有棧的「先進後出」的特性,同時還可以獲取棧中的最小值,要求此資料結構的pop、push、min方法的複雜度均為o(1)

這個題,最大的問題就在min方法上,如果不使用其他的輔助資料結構,是無法滿足min方法的設計要求,即使使用乙個臨時變數儲存當前的最小值(這種情況下,如果最小是被pop,就斷片了。。)。所以我們的注意力就集中在:怎們能讓乙個棧是有序的?其實讓棧內資料有序,使用排序的思路肯定是不行的,但是我們能夠維持「最小值」的連續性就可以。看看如下的設計思路:

使用2個棧來設計這個資料結構,分別為資料棧和輔助棧

資料棧用來儲存push的資料

輔助棧用來儲存「最小值」的連續性:

棧底<--------->棧頂

1)新增3

資料棧:3

輔助棧:3,3為最小值

2)新增4

資料棧: 3 4

輔助棧: 3 3

因為4 > 3,為了保持「最小值」連續性,我們在4對應的輔助棧的位置上仍然新增3。

3)新增2

資料棧: 3 4 2

輔助棧: 3 3 2

因為3 > 2,最小值變了,所以講新的最小值入棧。

如上所述,那麼min方法,只需要從輔助棧中peek棧頂的元素值就行了。

當資料棧中pop元素時,也將輔助棧中對應位置的元素移除。

**樣例如下:

static class minstack 

}helper.push(min);

}integer min()

return helper.peek();

}synchronized void pop()

data.pop();

helper.pop();

}}

二、請編寫乙個演算法用於判定:序列b為序列a作為棧時可能的彈出順序(a中的數字不會重複)

聽到題目,第一感覺就是:聽不懂!

先描述一下:假如有序列a為[1,2,3,4,5],它作為棧時由1開始依次入棧,序列b為[5,4,3,2,1]是a作為棧時的乙個彈出順序。但是序列a在沒有完全入棧時也可以彈出,比如[1,2,3,4]先入棧,然後彈出4,然後再將5入棧,那麼其彈出序列就是[4,5,3,2,1]。因為a入棧和出棧的時機可以任意,所以它的出棧序列可能會有多種,請你判定乙個給定的序列是否為a的乙個出棧順序。

實話說,看到這個題,我也沒有思路...如下為分析過程,突破口就是要用乙個輔助棧來儲存a。

將a儲存在資料棧,b使用乙個輔助棧

a:1 2 3 4 5

b:4 5 3 2 1 (假設序列)

1)遍歷a和b,以b作為判斷基準

2)在b中第乙個元素為4,因為a中1、2、3均不等於4,直到遇到4

則將它們都新增到資料棧

資料棧: 1 2 3

3)此時a與b都遇到4,我們認為是一次彈出(或者同時入棧,然後彈出)

4)b繼續遍歷,此時為5

判斷,5是否與資料棧的棧頂一樣,如果不一樣,則遍歷a的下乙個元素。

5)此時a與b都遇到5,我們認為是一次彈出。

6)a序列遍歷結束,只能根據資料棧作為判定。

7)b繼續遍歷,此時為3,從資料棧中彈出棧頂,比較是否也為3,如果是繼續

8)重複7,直到不相等(返回false)或者資料棧全部彈出(返回true)。

解題思路總結:從b中確定彈出元素,比如a,如果輔助棧的棧頂剛還是a,則彈出,否則遍歷a序列找到a,在a之前的元素全部新增到輔助棧中;如果所有的元素都查詢完仍沒有找到a,則認為判讀失敗。

**樣例:

public static void main(string args) ;

int target = ;

system.out.println(check(source,target));

}public static boolean check(int source,int target)

if(source.length != target.length)

int length = source.length;

stackdata = new stack<>();

int di = 0;//資料序列的索引位置

for(int i = 0; i < length; i ++)

int top = data.pop();

if(top == item) else

}while (di < length) else if(data.isempty()) else else }}

}return true;

}

三、使用廣度優先的方式遍歷二叉樹,並逐層列印節點值

推演思路:

假如輸入二叉樹,樹的結構如下:8/\

6 10

/\ /\

5 7 9 11

當前節點 佇列

8 6,10

6 10,5,7

10 5,7,9,11

5 7,9,11

7 9,11

9 11

11 空

要求列印結果:8 6 10 5 7 9 11

static class binarytree 

static class binarytreenode

public static void print(binarytree tree)

binarytreenode root = tree.root;

if(root == null)

queuedata = new linkedlist<>();

data.add(root);

while (!data.isempty())

binarytreenode right = current.right;

if(right != null)

}}

我們還需要簡單考慮一下,如果列印結果的要求是「逐層」?

比如上述二叉樹,列印結果為:

86 10

5 7 9 11

此時我們發現乙個佇列其實無法滿足設計需要,我們需要用兩個佇列:

1)

佇列1 佇列二

8 空

空 6 10

2)佇列1 佇列二

空 6 10

5 7 10

5 7 9 11 空

基本思路就是,在將其中乙個佇列出隊的時候,將其

子節點新增到另乙個佇列的尾部,且每次都將當前佇列

完全出隊,此後再以同樣的方式操作另乙個佇列。

**樣例:

public static void print(binarytree tree) 

binarytreenode root = tree.root;

if(root == null)

queuefirst = new linkedlist<>();

queuesecond = new linkedlist<>();

first.add(root);

while (true)

if(first.isempty()) else

}}private static void inner(queuefirst,queuesecond)

binarytreenode right = current.right;

if(right != null)

}system.out.println();

}

四、輸入乙個整數陣列,判斷該陣列是否為某二叉搜尋樹的後序遍歷結果

我們首先分析一下二叉樹後序遍歷結果的特點,比如是乙個正常的二叉樹後序遍歷結果;最後乙個元素一定是root節點,即為8;從陣列的乙個元素開始,首次遇到的比8大的元素之前的元素列表都是8的左子樹,其他的為右子樹,比如為左子樹,為右子樹。當然每個子樹也是「後序遍歷」的結果,比如對於左子樹,6就是其根節點,5是其左節點,7是有節點。這種比較的合法性是可傳遞的,即任何節點的左子樹元素都應該小於它的值,右子樹的元素都大於它的值。(無重複元素)

比如輸入,判斷這個序列是否為後序遍歷結果;由此得知:5是跟節點,是它的右子樹,但是其中4小於5,不符合判定規則,因此判斷結果為false。

**樣例:

public static boolean check(int source,int start,int end) 

int root = source[end];

int i = start;

//判斷左子樹的位置

for(;i < end; i++)

}int j = i;

for(;j < end - 1;j++)

}boolean left = true;

if(i > 0)

if(!left)

boolean right = true;

if (i < end - 1)

return left && right;

}

程式設計與演算法(三)多型 作業

答案 include using namespace std class b void fun b int n class d public b int main d fun b fun d fun nbval 2 nbval 24 ndval 8 b fun nbval 12 include us...

程式設計與演算法(三) C 多型學習

總時間限制 1000ms 記憶體限制 65536kb 在此處補充你的 描述 程式填空產生指定輸出 include using namespace std class b void fun b int n int main 輸入無輸出 d fun b fun d fun nbval 2 nbval 2...

演算法程式設計6 楊輝三角

給定乙個非負整數 numrows,生成楊輝三角的前 numrows 行 此題屬於動態規劃問題,針對此問題,首先找準規律 除第一行,每行第乙個元素和最後乙個元素都為1。其餘元素為左上方和右上方數之和。其次,找到特殊情況,第一行和第二行特殊,其餘都遵守規律。class solution def gene...