演算法筆記1

2021-10-21 07:20:04 字數 4375 閱讀 2501

題目:設計乙個演算法,找出陣列中最小的k個數。以任意順序返回這k個數均可

思路:快排+哨兵:

**:

class

solution

arr[low]

= tmp;

return low;

}void

topk

(int

arr,

int low,

int high,

int k)

int[

]smallestk

(int

arr,

int k)

}

題目:給你乙個字串 s 、乙個字串 t 。返回 s 中涵蓋 t 所有字元的最小子串。如果 s 中不存在涵蓋 t 所有字元的子串,則返回空字串 。注意:如果 s 中存在這樣的子串,我們保證它是唯一的答案。

思路:滑動視窗

**

class

solution

//統計需匹配字元種類數

for(

int i =

0; i < tcount.length; i++)}

int ansl =-1

, ansr =-1

, anslen = s.

length()

+1;//最小子串左下標,右下標,長度

int start =

0, end =0;

//2.視窗左邊界,有邊界

int match =0;

//視窗中已匹配字元種類數

char

windows =

newchar

[128];

//字元在視窗中的出現次數

char

cs = s.

tochararray()

;while

(end < cs.length)

//如果已匹配成功的字元==需匹配的字元,說明視窗內字串已經滿足條件,此時需要將左指標往右滑動,每滑動一次,判斷是否還滿足條件,若滿足條件,則根據長度更新最短字串

while

(match == need)

windows[cs[start]]--

;//減少當前字元在視窗的出現次數

//如果當前字元在t**現過且其出現次數大於在視窗**現次數,減少一種已匹配成功的字元

if(tcount[cs[start]]!=

0&& windows[cs[start]

]< tcount[cs[start]])

start++;}

end++;}

return ansl ==-1

?"": s.

substring

(ansl, ansr);}

}

題目:給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。

思路:當前格仔能接到的雨水=min(當前格仔左邊最大值,當前格仔右邊最大值)-當前格仔值或0

**

public

inttrap

(int

height)

//i右邊最大值=max(i+1右邊最大值,i+1的值)

for(

int i=height.length-

2;i>=

0;i--

)//i能接到的雨水=min(i左邊最大值,i右邊最大值)-i的值或者0

for(

int i=

0;i)return res;

}

給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。

思路:多次深度優先遍歷/廣度優先遍歷,島嶼數量其實就是聯通圖的數量,遍歷的次數==島嶼數量

**

public

intnumislands

(char

grid)}}

return res;

}//深度優先遍歷圖

void

dfs(

char

grid,

int row,

int col)

public

intnumislands

(char

grid)

if(col>

0&& grid[row]

[col-1]

=='1')if

(row1&& grid[row+1]

[col]

=='1')if

(col1&& grid[row]

[col+1]

=='1')}

}}}return res;

}

設計和實現乙個 lru (最近最少使用) 快取機制。

思路:雙向鍊錶+雜湊表

**

class

lrucache

dlinkednode()

} map

cache =

newhashmap

<

>()

; dlinkednode head,tail;

//偽節點

int capacity;

//容量

int size;

//元素數

public

lrucache

(int capacity)

//查詢:獲取值並將其移到煉表頭

public

intget

(int key)

return-1

;}//在表頭新增新節點或更新節點值並將其移到表頭

public

void

put(

int key,

int value)

else}}

//新增新節點到頭部

void

addtohead

(dlinkednode node)

//刪除節點

void

removenode

(dlinkednode node)

//移動已有節點到頭部

void

movetohead

(dlinkednode node)

//刪除尾節點

dlinkednode removetail()

}

給你乙個長度為 n 的鍊錶,每個節點包含乙個額外增加的隨機指標 random ,該指標可以指向鍊錶中的任何節點或空節點。構造這個鍊錶的 深拷貝。 深拷貝應該正好由 n 個 全新 節點組成,其中每個新節點的值都設為其對應的原節點的值。新節點的 next 指標和 random 指標也都應指向複製鍊錶中的新節點,並使原鍊錶和複製鍊錶中的這些指標能夠表示相同的鍊錶狀態。複製鍊錶中的指標都不應指向原煉表中的節點 。

思路:1.回溯+hashmap 2.新舊交替 **

//	1.圖深度優先+hashmap

hashmap

nodes =

newhashmap

<

>()

;//原節點-新節點

public node copyrandomlist

(node head)

//建立新節點+記錄到雜湊表中

node n =

newnode

(head.val)

;this

.nodes.

put(head,n)

;//遞迴構建next節點和random節點

n.next =

copyrandomlist

(head.next)

; n.random =

copyrandomlist

(head.random)

;return n;

}//2.新舊交替

public node copyrandomlist

(node head)

// 2.遍歷通過new.random = old.random.next 搞定random

old = head;

ne = old.next;

while

(old != null)

// 3.拆解鍊錶

old = head;

ne = old.next;

node nhead = ne;

while

(old != null)

return nhead;

}

演算法筆記(1)

問 乙個寬度一定的水池,長度不一定,深度不一定,求怎樣裝最多的水?思路 深度為陣列的值,長度為陣列之間的座標,例如 一串陣列,最大體積為7x7x5 245 public class demo demo demo newdemo system.out.println 最大體積為 demo.max ar...

演算法導論筆記 1

略過 2.1 插入排序這種方法類似於數學歸納法,只不過,數學歸納法是無限迭代的,而該方法在for或者while語句停止時,歸納停止,運用這種方法,可以幫我們有條理的證明某演算法在for或while迴圈上正確完備的達到了我們的期望。2.2 分析演算法 演算法的複雜度通常有以下幾種情況 2.3 設計演算...

演算法導論學習筆記 (1)

乙個acm若菜,趁著acm淡季,開始學習演算法導論了,經過一年的acm學習,逐漸的發現,學東西,深入才是王道,以前學習乙個演算法,總是看懂了就開始做題,到後來才發現很多題目,會演算法,卻不知道是用這個演算法,這就是演算法理解的不到位的後果,從今天開始,定下目標 1.深入系統的學習演算法,2.學會紙上...