題目:設計乙個演算法,找出陣列中最小的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.學會紙上...