leetcode 試題總結 5

2021-07-16 23:54:44 字數 3539 閱讀 8305

本篇開始說明棧和佇列的題目

232. implement queue using stacks

//功能:使用棧結構執行佇列結構的操作

//注意:只能使用棧結構的標準操作:即push、pop、peek、size、empty。

class queue 

// removes the element from in front of queue.

void pop(void)

// get the front element.

int peek(void)

}return out.top();

}// return whether the queue is empty.

bool empty(void)

};

總結:這也是乙個老題目,怎樣用棧的結構實現佇列的功能。這裡常見的方法就是構建兩個stack,假設為in和out。兩個棧的用處是不同的,in專門用來進行入佇列操作,out專門用來出佇列操作,不過需要進行的乙個操作是,當out棧為空時,需要將in中的元素逐一pop出來,然後push到out中去。這樣一倒,就實現了先進先出的佇列的功能。

225. implement stack using queues

//功能:使用佇列執行棧結構的操作 

//注意:只能使用佇列結構的標準操作:即push、pop、front、size、empty.

class stack

}else if(q2.empty() && !q1.empty())

}else if(q1.empty() && q2.empty())

q1.push(x);

}// removes the element on top of the stack.

void pop()

// get the top element.

int top()

// return whether the stack is empty.

bool empty()

};

//others code 

class stack

void push(int x)

else

}void pop()

else

data.pop();

}int top()

int getmin()

};

//others code 

class minstack

void push(int x)

void pop()

else

cerr<<"empty"stackmindata;

};

總結:這道題是讓構建乙個棧,使其支援push, pop, top, 和返回棧中最小的元素值getmin的操作,前面的三個自然不同操心,普通棧就可以實現,關鍵是怎麼讓乙個棧記住其最小值元素呢,這裡的思路是:構建另外乙個棧,假設為minstack,讓其專門維護我們的主棧,記錄主棧的最小元素。當需要push乙個元素的時候,先push該元素到主棧,在判斷維護棧minstack的情況,若為空,則好說,push元素到維護棧,若不為空,判斷維護棧棧頂元素top和該元素的大小,若該元素小於等於棧頂元素(注意等於的情況不可少,否則棧中出現相同元素時會出錯),則將該元素push進minstack,如大於,則不同操作。當需要pop元素的時候,我們比較主棧棧頂元素與維護棧棧頂元素的大小,若主棧元素小於等於維護棧棧頂,則不但要pop主棧元素,還要pop維護棧元素。就這樣,實現了維護棧可動態記錄主棧最小元素的功能。

還有一種稍微有點區別的方式上面第二段**,該段**中主棧和維護棧元素自始至終是一樣多的,而且一同push,一同pop,唯一不同的是,當push進主棧的元素非維護棧中的最小元素時,push進維護棧的是維護棧的最小元素,而不是push進主棧的元素x,這樣寫的好處就是在pop時直接pop就好了,不用再判斷。

20. valid parentheses

//my code

//功能:給定乙個字串只包含'(',')','','[',']'這六種字元,請判斷我們輸入的這六種字元是否是合法的。

合法的標準是三種括號應該正確的閉合,"()""(){}"都是合法的 但是"(]""([)]"就不是。

class solution

else

else

}else if(s[i] == '}')

else

}else if(s[i] == ']')

else}}

}if(!str.empty())

return false;

return true;

}};

//others code 

class solution ': if (paren.empty() || paren.top()!='

}return paren.empty() ;

}};

//others code
bool isvalid(string s) '&&st.top()==' return st.empty()?true:false;}

//others code

class solution ,,','};

for (std::string::iterator iter = s.begin(); iter0)

return false;

else

return true;

}};

總結:這一題是典型的使用壓棧的方式解決的問題,題目中還有一種valid情況沒有說明,需要我們自己考慮的,就是"()"這種層層巢狀但

可以完全匹配的,也是valid的一種。解題思路是這樣的:

我們對字串s中的每乙個字元c,如果c不是右括號,就壓入棧stack中。

如果c是右括號,判斷stack是不是空的,空則說明沒有左括號,直接返回not valid,非空就取出棧頂的字元pre來對比,如果是匹配

的,就彈出棧頂的字元,繼續取s中的下乙個字元;如果不匹配,說明不是valid的,直接返回。當我們遍歷了一次字串s後,注意

這裡還有一種情況,就是stack中還有殘留的字元沒有得到匹配,即此時stack不是空的,這時說明s不是valid的,因為只要valid,一

定全都可以得到匹配使左括號彈出。

上面的題目中給出了多種答案,思路都是相似的,但是**的簡介程度就有很明顯的差別了,我自己寫的完全是為了通過答案,**顯的很冗餘,別人寫的第一種就顯得很簡單,用到了範圍for和switch語句。最後一種答案用到了map容器,雖然覺得沒大比要,但是**寫的還是值得學習的。

leetcode試題總結 8

257.binary tree paths 題意 給定乙個二叉樹,返回其從根到葉子節點的每一條路徑 definition for a binary tree node.struct treenode class solution if root left binarytree result,root...

LeetCode習題總結 演算法(5)

首先先上原題 通過給定對應七種羅馬數字對應的七種字元 i,v,x,l,c,d 和 m 以及對應七種字元所對應的數值 i 1,v 5,x 10,l 50,c 100,d 500,m 1000。去求解在給定乙個羅馬字串時,對應的羅馬數字表示為多少。思路 基於此題目,我們可以發現對應的羅馬字元和羅馬數字之...

微軟面試題模擬 蛇形矩陣Leetcode 54

1.先不要一上來就寫 先把問題的描述和邊界,以及思路和面試官說清楚。2.然後開始寫 3.寫 的時候,如leetcode那樣,實現乙個函式介面 這道題目使用o n 空間的簡潔做法,利用了矩陣的規律,vector在使用的時候注意提前申請好空間,避免用push back.比較簡單的一題。class sol...