c 刷題(3 100)數獨,棧和佇列

2022-09-08 05:24:09 字數 3234 閱讀 3540

stack的基本操作

s.size():返回棧中的元素數量 

s.empty():判斷棧是否為空,返回true或false 

s.push(元素):返回對棧頂部「元素」的可變(可修改)引用 

s.pop():刪除棧頂元素,型別為void,但並不返回被刪除的元素 

s.top():返回棧頂,不刪除

s1==s2:若成立,表明s1中的每個元素都等於s2的對應元素,返回true或是false

題目1:用兩個棧實現佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

思路:比較簡單,兩個棧s1,s2 push的時候就往s1裡push,pop的時候,先把s1中的元素全部push到s2,再pop就是佇列順序。這個題也可以描述為如何讓棧逆序輸出

class

solution

intpop()

int res =stack2.top() ;

stack2.pop() ;

while(!stack2.empty())

return

res ;

}private

: stack

stack1;

stack

stack2;

};

題目2:滑動視窗最大值

給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為; 針對陣列的滑動視窗有以下6個: , , , , , 。

思路:這個題o(n*k)很簡單,但是要o(n)就有說法了,o(n)的方法是雙向佇列

先看我的比較挫的版本,用了兩個佇列:

class

solution

for(int i=0;i)

else

q.push(nums[i]) ;

}ans.push_back(qmin.front()) ;

for(int i=k;i)

q.pop() ;

q.push(nums[i]) ;

while(!qmin.empty()&&qmin.back()

qmin.push_back(nums[i]) ;

ans.push_back(qmin.front()) ;

}return

ans ;}};

再看網上大神的版本:乙個雙端佇列,**也比我簡潔。。。

class

solution

for(int i=0;i)

return

ans ;}};

題目3:數獨

編寫乙個程式,通過已填充的空格來解決數獨問題。

乙個數獨的解法需遵循如下規則:

數字1-9在每一行只能出現一次。

數字1-9在每一列只能出現一次。

數字1-9在每乙個以粗實線分隔的3x3宮內只能出現一次。

空白格用'.'表示。

乙個數獨。

答案被標成紅色。

note:

本來以為要用a*,結果發現直接搜也沒有超時,還有原題目是void函式,沒有返回真的難受,搜尋的題如果遞迴函式沒有返回那怎麼知道找到了沒啊。

最後發現別人強行把示例的函式改成了bool型,然後可以過。

最後複習一下個位數的int-》char就是num+'0',char->int就是str-『0』

class

solution

if(i!=y&&board[x][y]==board[x][i])

}for(int i=3*(x/3);i<3*(x/3+1);i++)}}

return

true

; }

bool solvesudoku(vectorchar>>&board)

board[i][j] = '.'

; }

return

false

; }}}

return

true

; }

};

ps:記錄兩個資料結構

小頂堆和大頂堆(優先佇列):

priority_queue, less> maxheap; //

儲存小的值,值越大,優先順序越高

priority_queue, greater> minheap; //

儲存大的值,值越小,優先順序越高

雙向佇列:

deq[ ]:用來訪問雙向佇列中單個的元素。

deq.front():返回第乙個元素的引用。

deq.back():返回最後乙個元素的引用。

deq.push_front(x):把元素x插入到雙向佇列的頭部。

deq.pop_front():彈出雙向佇列的第乙個元素。

deq.push_back(x):把元素x插入到雙向佇列的尾部。

deq.pop_back():彈出雙向佇列的最後乙個元素。

支援隨機訪問,即支援[ ]以及at(),但是效能沒有vector好。

可以在內部進行插入和刪除操作,但效能不及list。

deque兩端都能夠快速插入和刪除元素,而vector只能在尾端進行。

deque的元素訪問和迭代器操作會稍微慢一些,因為deque的內部結構會多乙個間接過程。

deque迭代器是特殊的智慧型指標,而不是一般指標,它需要在不同的區塊之間跳轉。

deque可以包含更多的元素,其max_size可能更大,因為不止使用一塊記憶體。

deque不支援對容量和記憶體分配時機的控制。

在除了首尾兩端的其他地方插入和刪除元素,都將會導致指向deque元素的任何pointers、references、iterators失效。不過,deque的記憶體重分配優於vector,因為其內部結構顯示不需要複製所有元素。

deque的記憶體區塊不再被使用時,會被釋放,deque的記憶體大小是可縮減的。不過,是不是這麼做以及怎麼做由實際操作版本定義。

deque不提供容量操作:capacity()和reverse(),但是vector可以。

刷題 棧和佇列

一 因為有太多遺忘的東西了,所以做題速度會很慢 現在理解題目,把題目理解好了,然後去看題解,看完題解,在去搜尋相關知識點進行補充。二 題目 三 理解 棧 先進後出 佇列 先進先出 要滿足題目的要求,我們要把棧底輸出出來,我們可以把棧倒著輸出,就可以滿足佇列的先進先出。所以我們需要兩個棧來,第乙個棧是...

刷題 棧和佇列(2)

一 題目 二 題目理解 1.用棧實現,所以既要滿足找到最小值,同時元素位置沒有變 我們可以用兩個棧進行實現,乙個主棧存放元素,另乙個副棧存放最小值,每當需要最小值的時候,我就top出副棧即可,需要當前位置的時候,top出主棧。三 展示 1 2 initialize your data structu...

刷題 搜尋 新數獨

很暴力的搜尋,還沒有什麼剪枝.心得 如果只查詢和修改,用bool比bitset快 rnt在迴圈中會比int快 減少簡單的函式呼叫 include include include include define rnt register int using namespace std int ans 1...