資料結構與演算法

2021-09-07 09:07:38 字數 3148 閱讀 1635

右移k位的過程就是按後k位和剩餘位分成兩部分,分別逆序排列,然後把整個陣列逆序排列。

變換過程通過以下步驟完成:

1.逆序排列 abcd: abcd1234 -> dcba1234;

2.逆序排列 1234: dcba1234-> dcba4321;

3.全部逆序 dcba4321->1234abcd。

方法1:將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。

node * reverselist(node *head)

head->next=null; //原先的head已經變成tail,別忘了置空,只有到這步才能置空

*head=p1;

return head;

}

方法3:從第2個節點到第n個節點,依次逐節點插入到第1個節點(head節點)之後,最後將第乙個節點挪到新錶的表尾。

方法1的問題是浪費空間。方法2和方法3效率相當。一般方法2較為常用。

void reverslist(list p)

o(?)

1.快慢指標相遇

從頭指標開始,每次分別移動2、1個節點

2.每個節點設flag

mapnode;
3.窮舉 線性查詢到hashset

每遍歷到乙個新節點,就用新節點和hashset集合當中儲存的節點作比較,如果發現hashset當中存在相同節點id,則說明鍊錶有環,如果hashset當中不存在相同的節點id,就把這個新節點id存入hashset。

時間複雜度:hashset查詢為o(1),使得線性查詢使得o(n*n)變為o(n*1)

空間複雜度:o(1)變為o(n)

快慢指標法 若無環,快指標先為空

fast = fast->next ? fast->next : null; //fast->next == null?

if (null == fast) break;

p1和p2分別都是head指標,先將p2向右移動k次。(此時k為2)

只需要繼續保持p1和p2等間距的右移,當p2的next為null,則證明p1所指的結點的值為倒數第k個節點的值

快慢指標方法

建立兩個指標,乙個指標一次遍歷兩個節點,另乙個節點一次遍歷乙個節點,當快指標遍歷到空節點時,慢指標指向的位置為鍊錶的中間位置。

1.窮舉 hashset兩次遍歷 時間複雜度為:o(max(len1+len2);空間複雜度o(len1)

2.設flag

3.利用有環鏈表思路

對於兩個沒有環的鍊錶相交於一節點,則在這個節點之後的所有結點都是兩個鍊錶所共有的。如果它們相交,則最後乙個結點一定是共有的,則只需要判斷最後乙個結點是否相同即可。時間複雜度為o(len1+len2)。

對於相交的第乙個結點,則可求出兩個鍊錶的長度,然後用長的減去短的得到乙個差值 k,然後讓長的鍊錶先遍歷k個結點。

還可以這樣:其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個

next函式:

(1)next[0]= -1

,任何串的第乙個字元的模式值規定為-1

(2)next[j] = -1

,模式串

t中下標為

j的字元,如果與首字元相同

前k個字元不等或者相等但t[j] == t[k](匹配夾帶了a[j])。1≤k

t=」aba」 則 next[2]=-1,因k取1,t[2]與首字母相同,但前1個不匹配

t=」abc abc ad」 則 next[6]=-1,因k取3,但t[3]=t[6]

(3)next[j] = k

,模式串

t中下標為

j的字元,如果

前k個字元相等,且t[j] != t[k](匹配不能夾帶a[j])。1≤k

(4)next[j]=0

,除(1)

、(2)

、(3)

的其他情況。

設在字串s中查詢模式串t,若s[m]!=t[n],那麼,取t[n]的模式函式值next[n]

(1) next[n]=  -1

表示s[m]

和t[0]

間接比較過了,不相等,下一次比較

s[m+1]

和t[0];

(2) next[n]=0

表示比較過程中產生了不相等,下一次比較

s[m]

和t[0];

(3) next[n]= k >0

但k,表示

s[m]的前k

個字元與

t中的,開始

k個字元已經間接比較相等了,下一次比較

s[m]

和t[k]

相等嗎?

入隊時,直接壓入stack1中

出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素

//入隊操作

void enqueue(stack&s1,stack&s2,int m)

//出隊操作

void dequeue(stack&s1,stack&s2,int &m)

//出棧操作

void stackpop(queue&q1,queue&q2,int &m)

{ int p = q1.size();

for (int i=0;i高度和深度定義

如果結點中有乙個指向父結點的指標,我們可以把問題轉化為求兩個鍊錶的共同結點。

*poj2499

資料結構與演算法 演算法 演算法和資料結構

資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...

資料結構 資料結構與演算法01

1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...

資料結構 資料結構與演算法02

1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...