第一題
一個(gè)數(shù)組有N個(gè)數(shù)对蒲,給一個(gè)數(shù)字S钩蚊,找到數(shù)組兩個(gè)數(shù)字加起來等于S,這個(gè)數(shù)組中只有一個(gè)解
根據(jù)數(shù)組構(gòu)建一個(gè)map齐蔽,key是數(shù)字,value是數(shù)字在數(shù)組的位置床估。遍歷數(shù)組含滴,查看map中是否有key=S-當(dāng)前數(shù)組位置值。如果有返回map的value和當(dāng)前位置丐巫,沒有的話當(dāng)前值和位置進(jìn)入map谈况。
第二題
兩個(gè)鏈表節(jié)點(diǎn)都存的是單個(gè)數(shù)字勺美,兩個(gè)鏈表從頭開始相加,最后的結(jié)果是鏈表表示兩個(gè)數(shù)字相加的結(jié)果碑韵。2->4->3 5->6->4. 相加結(jié)果是 7->0>8
1.遍歷2個(gè)鏈表赡茸,如果兩個(gè)鏈表節(jié)點(diǎn)都是空了退出循環(huán),判斷如果有進(jìn)位構(gòu)建一個(gè)數(shù)值為1的節(jié)點(diǎn)連到新的隊(duì)列祝闻。
2.遍歷流程是:計(jì)算2個(gè)節(jié)點(diǎn)的值+進(jìn)位值=n占卧,n%10等于當(dāng)前位的值,n/10等于進(jìn)位信息联喘。然后到下一個(gè)節(jié)點(diǎn)如此遞歸华蜒。
第三題
求一個(gè)字符串中最長子串,沒有重復(fù)字符
1. 從字符串第一個(gè)字符開始遍歷豁遭,往前推找最長子串叭喜,比如當(dāng)前位置10,往9位置看一直看到?jīng)]有重復(fù)字符
2. 求一個(gè)位置i往前看最長不重復(fù)子串蓖谢,依賴這個(gè)字符之前最后一次出現(xiàn)的位置和i-1位置求出的最長子串位置的最大值捂蕴。
第四題
求兩個(gè)有序數(shù)組的中位數(shù),如果數(shù)組加起來是偶數(shù)返回兩個(gè)數(shù)字除以2.
取第一個(gè)數(shù)組的上中位數(shù)闪幽,與第二個(gè)數(shù)組的上中位數(shù)比較啥辨。如果相等返回,如果小于取第一個(gè)數(shù)組大于中位數(shù)部分和第二個(gè)數(shù)組小于中位數(shù)部分沟使,組成一個(gè)新數(shù)組重新取中位數(shù)委可。大于的時(shí)候是一樣。
第五題
給你一個(gè)數(shù)組腊嗡,數(shù)組的值代表柱子高度着倾,選擇兩個(gè)柱子能裝最大的水量。
取第一個(gè)數(shù)字和最后一個(gè)數(shù)字算水量燕少。 如果左邊數(shù)字比較小卡者,左邊下標(biāo)右移然后計(jì)算水量。如果右邊數(shù)字小客们,右邊下標(biāo)左移計(jì)算水量崇决。左右下標(biāo)碰撞計(jì)算完畢,取計(jì)算水量的最大值
第六題
求一個(gè)字符串?dāng)?shù)組中底挫,所有字符串的公共最長子串
取第一個(gè)字符串恒傻,循環(huán)遍歷后續(xù)所有字符串,每個(gè)字符串與第一個(gè)字符串求公共子串建邓,保留位置盈厘。取所有位置最小的
第七題
一個(gè)數(shù)組,三個(gè)數(shù)字相加等于0官边,給出所有這種組合
1.求兩個(gè)數(shù)據(jù)相加等于N的所有組合(二元組)沸手,數(shù)組先排序,兩個(gè)指針外遇,一個(gè)頭一個(gè)尾,相加與N比契吉,等于N收集答案跳仿。如果小于N,左邊指針右移捐晶,如果大于N菲语,右指針左移。
2.假設(shè)結(jié)果的第一位為是數(shù)組的第一位租悄,那么就是求下標(biāo)1開始的子數(shù)組的二元組問題谨究。假設(shè)結(jié)果的第一位為數(shù)組第二位,依次類推
第八題
一個(gè)計(jì)數(shù)器泣棋,每個(gè)數(shù)字代表三個(gè)字母胶哲,如果按了N個(gè)數(shù)字,計(jì)算所有組合的字母潭辈。
1.按每個(gè)個(gè)數(shù)字可以做3個(gè)決定鸯屿,可以采取暴力深度遞歸,每個(gè)決定后再取下一個(gè)按鍵代表的3個(gè)決定把敢,直到按鍵按完寄摆。按完的時(shí)候每一步的決定組合起來就是答案。
第9題
給你一個(gè)鏈表修赞,刪除倒數(shù)第N個(gè)節(jié)點(diǎn)
雙指針婶恼,第一個(gè)指針先挪N位,第二個(gè)指針開始跟著挪柏副。
第10題
給一個(gè)字符串勾邦,包含3種括號(hào){[()]},判斷是否一一匹配
字符是左括號(hào)入棧割择,是右括號(hào)眷篇,棧彈出配對(duì),如果配對(duì)失敗不符合規(guī)則荔泳。如果字符串遍歷完都配對(duì)成功蕉饼,符合規(guī)則
第11題
一個(gè)字符 串只能包含(),假設(shè)要構(gòu)建的字符串長度為6玛歌,需要滿足括號(hào)配對(duì)昧港。比如()()(),((()))。問總共有多少這種組合
方案1:暴力遞歸支子,每個(gè)位置只能做()兩個(gè)決定创肥,組合出所有決定,然后判斷這些決定中哪些字符串合法。
方案2:需要剪枝瓤的,如果前面都做了三個(gè)(決定,后面不能夠再做(決定了吞歼。用數(shù)字表示做了幾次(的決定圈膏,下一個(gè)是(的決定取決于已經(jīng)做過幾個(gè)了。
第12題
合并k個(gè)排序好的鏈表
取各個(gè)鏈表的第一個(gè)節(jié)點(diǎn)丟入小根堆篙骡,然后彈出作為頭結(jié)點(diǎn)稽坤。取彈出節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)丟入小根堆,然后彈出堆頂元素糯俗,直到堆空尿褪。利用小根堆,priorityQueue得湘。
第13題
給一個(gè)有重復(fù)數(shù)字的數(shù)組杖玲,把所有不重復(fù)的數(shù)字放到數(shù)組前面。
兩個(gè)指針淘正,done在0位置摆马,cur在1位置。 判斷cur和done是否一致鸿吆,一致cur右移動(dòng)囤采。不一致done右移,done位置的數(shù)字和cur位置的數(shù)字互換惩淳,cur右移蕉毯。
第14題
一個(gè)數(shù)組找缺少的最小整數(shù),比如數(shù)組是129思犁,結(jié)果是3. 數(shù)組是569代虾,結(jié)果是4.
數(shù)組0位置放1,依次類推抒倚,知道找出最長有效數(shù)組褐着,比如找到1234,那最小正整數(shù)是5.
L指針指向0位置托呕,R指針指向末尾含蓉。 如果L指針指向的位置數(shù)字比R位置要放的數(shù)字(R+1)要大,L上的數(shù)字要廢棄项郊,L和R位置數(shù)字交換馅扣,R左移。直到L和R相撞着降,如果L上的數(shù)字不比R+1大差油,那把L上的數(shù)字V與V-1位置的數(shù)字交換。
第15題接雨水
求某一個(gè)位置可以裝的水量,等于這個(gè)位置往左的最高點(diǎn)和往右的最高點(diǎn)中的最小值與本身值的身高差蓄喇。所有位置的水量加起來
16. 跳躍游戲
指針在0位置发侵,判斷最大可到達(dá)位置為max。指針+1妆偏,判斷位置是否大于max刃鳄,如果大于,返回false钱骂。否則判斷從當(dāng)前位置能夠跳的最大距離與max比取最大值叔锐。
17. 全排列
第一個(gè)位置可以做N個(gè)決定,第二個(gè)位置可以做N-1個(gè)決定见秽,依次類推
18. 旋轉(zhuǎn)圖像
先旋轉(zhuǎn)最外層愉烙,再旋轉(zhuǎn)里面一層,依次類推
19. 計(jì)算一個(gè)數(shù)字的N次方
https://leetcode-cn.com/problems/powx-n/
解法:比如求Y的N次方解取,N按二進(jìn)制表示步责,比如10次方:1010。代表Y的2次方+Y的8次方禀苦。
20.螺旋矩陣
https://leetcode-cn.com/problems/spiral-matrix/
解答:先打印最外層勺择,然后打印里面一層,直到結(jié)束伦忠。最里面一層可能是一個(gè)圈省核,可能是一行或者一列,或者一個(gè)點(diǎn)昆码。
21. 不同路徑
https://leetcode-cn.com/problems/unique-paths/
解答:第一行和第一列每一個(gè)格子到達(dá)只有一種走法气忠,第(x,y)個(gè)格子抵達(dá)的走法等于x-1,y和x,y-1兩個(gè)格子走法相加谬莹。
22.不同路徑II
https://leetcode-cn.com/problems/unique-paths-ii/submissions/
解答:有障礙物的格子走法變成0绞幌,其他的走法與第一種相同厂财。
23.x的平方根
https://leetcode-cn.com/problems/sqrtx/
解答:二分法御板,1-N二分,如果中間位置m*m大于n左邊找蒸矛,否則右邊找惧所。
24. 爬樓梯
https://leetcode-cn.com/problems/climbing-stairs/submissions/
25. 矩陣置零
https://leetcode-cn.com/problems/set-matrix-zeroes/
26. 顏色分類
https://leetcode-cn.com/problems/sort-colors/
首先辅肾,迭代計(jì)算出0陪毡、1 和 2 元素的個(gè)數(shù)米母,然后按照0、1毡琉、2的排序铁瞒,重寫當(dāng)前數(shù)組
27. [只出現(xiàn)一次的數(shù)字】
https://leetcode-cn.com/problems/single-number/
所有的數(shù)字進(jìn)行異或操作,結(jié)果就是
28. [復(fù)制帶隨機(jī)指針的鏈表]
(https://leetcode-cn.com/problems/copy-list-with-random-pointer/)
每個(gè)節(jié)點(diǎn)進(jìn)行復(fù)制桅滋,放入map慧耍,key為原節(jié)點(diǎn),value為復(fù)制后節(jié)點(diǎn)。然后處理復(fù)制出來節(jié)點(diǎn)的指針芍碧。
29. 單詞拆分
根據(jù)前綴劃分煌珊,
場景1:字符串第一個(gè)字符是否在字典中,如果在泌豆,分解方法等于后續(xù)子字符串的分解方法怪瓶。
場景2:字符串前2個(gè)字符是否在字典中,如果在践美,,分解方法等于后續(xù)子字符串的分解方法找岖。
依次類推陨倡。改動(dòng)態(tài)規(guī)劃:【0,j】區(qū)間是否可以被拆分许布,取決于之前的某個(gè)i位置(i<j)能否被拆分+[i,j]是否在字典中(i從0到j(luò)遍歷)
30.#### 環(huán)形鏈表
一個(gè)快指針兴革,一次走2步,一個(gè)慢指針走1步蜜唾。如果快指針走出去了杂曲,沒有環(huán)。如果兩指針相遇袁余,慢指針不動(dòng)擎勘,快指針從頭開始走,再次相遇即是入口
31.#### LRU 緩存
雙鏈表(自己實(shí)現(xiàn))+map
map颖榜,存key和kv構(gòu)建的node棚饵,鏈表從尾部放入node(頭是最久數(shù)據(jù))。
get的時(shí)候從map中拿掩完,然后調(diào)整node的位置噪漾。
32.#### 排序鏈表
鏈表用歸并排序,拆成2部分排序且蓬,然后合并欣硼。
33.#### 直線上最多的點(diǎn)數(shù)
必經(jīng)過某個(gè)點(diǎn),算出最長路徑恶阴。遍歷后續(xù)所有點(diǎn)與某個(gè)點(diǎn)算斜率诈胜,放入map(key為斜率,value為節(jié)點(diǎn))
34.#### 逆波蘭表達(dá)式求值
棧冯事,數(shù)字入棧耘斩,遇到運(yùn)算符彈出2個(gè)數(shù)字計(jì)算重新入棧
36.#### 乘積最大子數(shù)組
求每個(gè)以nums[i]結(jié)尾的子數(shù)組最大乘積,最大乘積有3種情況:自己就是最大桅咆,自己是整數(shù)的時(shí)候乘以nums[i-1]的最大乘積括授,自己是負(fù)數(shù)的時(shí)候乘以nums[i-1]的最小乘積。取3者最大。
37.#### 最小棧
實(shí)現(xiàn)一個(gè)棧荚虚,可以push和pop方法和獲取最小元素的方法
解決:設(shè)計(jì)2個(gè)棧薛夜,第一個(gè)棧正常壓,第二個(gè)棧進(jìn)入的時(shí)候判斷棧里的元素是否要小版述,如果小就棧頂元素重復(fù)壓梯澜,否則數(shù)據(jù)進(jìn)棧
38.###### 相交鏈表
算每個(gè)鏈表的長度,假設(shè)是 100和80渴析,都遍歷到最后晚伙,如果最后節(jié)點(diǎn)不相交,鏈表不相交俭茧。如果尾節(jié)點(diǎn)相交咆疗,長鏈路從頭節(jié)點(diǎn)開始走20步驟,短鏈表指針開始走母债,相遇的時(shí)候即是第一個(gè)相交節(jié)點(diǎn)午磁。
39.#### 尋找峰值
找到一個(gè)數(shù)組中的一個(gè)局部高點(diǎn),用logn算法
解法:第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)先判斷毡们,如果第一個(gè)和最后一個(gè)都不是迅皇,表示數(shù)字高于0位置低于尾位置。進(jìn)行二分如果中間點(diǎn)大于中間前一個(gè)位置和后一個(gè)位置衙熔,則返回m登颓。如果不是,左側(cè)比m小左邊繼續(xù)二分红氯。否則肯定是右側(cè)比他大挺据,右側(cè)二分。
40.缺失區(qū)間
1.遍歷數(shù)組脖隶,判斷每個(gè)數(shù)字與區(qū)間lower的區(qū)間扁耐,然后把lower增長到這個(gè)數(shù)字。遍歷第二個(gè)數(shù)字判斷與lower的區(qū)間产阱,依次執(zhí)行婉称。
41.#### 分?jǐn)?shù)到小數(shù)
a/b作為小數(shù)點(diǎn)前部分,余數(shù)*10/b,把余數(shù)的位置map記錄下來构蹬,如此往后計(jì)算王暗,直到余數(shù)重復(fù)。
42.#### 多數(shù)元素
依次刪除2個(gè)不同的數(shù)字庄敛,最后留下來的數(shù)字就是答案俗壹。靶子血量的概念。數(shù)字進(jìn)來藻烤,判斷血量為0绷雏,數(shù)字作為靶子头滔,血量+1。如果血量不為0涎显,判斷數(shù)字是否等于靶子坤检,等于血量+1,否則血量-1.
43.#### 顛倒二進(jìn)制位
獲取32數(shù)字每一位期吓,先獲取第一位早歇,在獲取第二位。第一位放入結(jié)果中讨勤,遍歷依次結(jié)果左移一位箭跳,依次類推
44.#### Excel 表列序號(hào)
45.#### 最大數(shù)
將數(shù)組排序,排序規(guī)則是a.b>b.a a排在前面潭千,b.a>a.b谱姓,b排在前面
46.#### 輪轉(zhuǎn)數(shù)組
左部分逆序,右部分逆序脊岳,整體逆序
47.#### 位1的個(gè)數(shù)
m&(~m+1)提取最后一個(gè)1,統(tǒng)計(jì)數(shù)+1垛玻,然后m^=提取一個(gè)1后面的結(jié)果割捅,判斷m不為空,如此循環(huán)即可
48.#### 打家劫舍
討論從0位置開始打劫帚桩,必需包含位置i的最大打劫價(jià)值亿驾。dp[i]=Math.max(dp[i-1],(dp[i-2]+nums[i])
49.#### 島嶼數(shù)量
遍歷二維數(shù)組,遇到1就改為2账嚎,并且上下左右把所有1改為2莫瞬,島嶼次數(shù)+1.
50.#### 快樂數(shù)
不停計(jì)算,用set保留每一次計(jì)算的結(jié)果郭蕉,如果下一次的結(jié)果在set里面存在則不是快樂數(shù)疼邀。
50.#### 課程表
課程依賴關(guān)系建立成一張圖,先取入度為0的節(jié)點(diǎn)召锈,依次取下一階段入度為0的節(jié)點(diǎn)旁振,直到課程都遍歷完,所有入度為0的節(jié)點(diǎn)數(shù)等于依賴數(shù)涨岁。
51.#### 數(shù)組中的第K個(gè)最大元素
快速排序拐袜,找到一個(gè)數(shù)字,如果剛好是k大元素梢薪,返回蹬铺,如果不是從左邊或者右邊找
52.#### 二叉搜索樹中第K小的元素
中序遍歷,訪問的第k個(gè)元素
53.#### 回文鏈表
快慢指針秉撇,快指針走2步甜攀,慢指針走一步秋泄,定位到中間節(jié)點(diǎn),然后把中間節(jié)點(diǎn)的后面部分鏈表反轉(zhuǎn)赴邻,接著比較2部分鏈表印衔。
54.#### 二叉樹的最近公共祖先
map存放每個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)k:節(jié)點(diǎn),v:父節(jié)點(diǎn)姥敛。找p的所有父節(jié)點(diǎn)放入Set中奸焙,依次找q的父節(jié)點(diǎn),如果節(jié)點(diǎn)在Set中彤敛,那就是最近公共祖先
55.#### 刪除鏈表中的節(jié)點(diǎn)
把下一個(gè)節(jié)點(diǎn)的值賦給當(dāng)前節(jié)點(diǎn)与帆,當(dāng)前節(jié)點(diǎn)指針指向下下個(gè)節(jié)點(diǎn)
56.#### 尋找重復(fù)數(shù)
環(huán)形鏈表概念,慢指針一步墨榄,快指針2步玄糟,快慢指針相遇,慢指針歸0袄秩,快指針和慢指針都走一步阵翎,相遇即是結(jié)果。 我們對(duì)nums 數(shù)組建圖之剧,每個(gè)位置 i 連一條 i→nums[i] 的邊.
57.#### 基本計(jì)算器 II
定義一個(gè)棧郭卫,結(jié)果是棧里元素相加。 第一個(gè)數(shù)字num1先入棧背稼,第二個(gè)是計(jì)算符號(hào)先變量暫存ys1贰军,取第三個(gè)數(shù)字num3完成后,到第2個(gè)運(yùn)算符ys2的時(shí)候蟹肘,判斷第二個(gè)計(jì)算符合ys1是什么词疼。如果是+,數(shù)據(jù)num3 push棧帘腹,如果是-贰盗,push負(fù)的num3。如果是*num3與棧pop數(shù)據(jù)num1相乘入棧阳欲,如果是除棧pop數(shù)據(jù)num1除數(shù)據(jù)num3. 然后暫存ys2.
58.#### 除自身以外數(shù)組的乘積
遍歷數(shù)組童太,找到所有不是0的數(shù)字的乘積為all,找到多少個(gè)0假設(shè)問zeros胸完。如果zeros沒有书释,則每個(gè)nums的值等于all/自己,如果zeros=1赊窥,只有值為0的位置等于all爆惧,其他位置等于0. 如果zeros>1所有位置等于0
59.#### 搜索二維矩陣 II
從第一行最后面一個(gè)元素m開始找,如果target>m,往下找锨能,如果targe<m往左找扯再。
60. 有效的字母異位詞
用一個(gè)256的數(shù)組芍耘,記錄每一個(gè)字母出現(xiàn)的次數(shù),比如字母a的ascii碼是97熄阻,那num[97]++.遍歷一個(gè)字符串得到斋竞。 遍歷另外一個(gè)字符串,將統(tǒng)計(jì)字母的次數(shù)--秃殉,一旦有一個(gè)減成負(fù)數(shù)返回不是坝初。
61. #### 最長遞增子序列
定義dp[i]為必需包含i位置的最長子序列,它等于前面所有數(shù)字小于自己位置的dp[j]的最大值+1钾军。 結(jié)果就是所有dp中的最大值鳄袍。
62.尋找名人,一個(gè)節(jié)點(diǎn)吏恭,所有其他節(jié)點(diǎn)都認(rèn)識(shí)他
一次遍歷拗小,找到后面所有節(jié)點(diǎn)都不認(rèn)識(shí)他。假設(shè)他為80位置樱哼,總共100個(gè)點(diǎn)哀九。
第二次遍歷,前面79個(gè)點(diǎn)判斷是否都認(rèn)識(shí)80的位置搅幅。如果是返回80位置阅束。
算了放棄。盏筐。
63.#### 完全平方數(shù)
64.#### 移動(dòng)零
兩個(gè)指針i第一個(gè)指向-1围俘,第二個(gè)j從0開始砸讳,如果nums[j]!=0 琢融,將nums[j]與nums[i+1]交換,并且i+1.j遍歷完數(shù)組即可簿寂。
65. 生命游戲
66. #### 數(shù)據(jù)流的中位數(shù)
構(gòu)建大根堆漾抬,小根堆。 大根堆為空進(jìn)大根堆常遂,數(shù)據(jù)小于大根堆頂纳令,進(jìn)大根堆否則進(jìn)小根堆。進(jìn)行balance克胳,如果大根堆數(shù)量等于小根堆數(shù)量+2平绩,大根堆彈出堆頂進(jìn)入小根堆。小根堆數(shù)量=大根堆數(shù)量+2漠另,小根堆彈出堆頂進(jìn)入大根堆捏雌。
數(shù)據(jù)遍歷完成后,如果大根堆數(shù)量等于小根堆數(shù)量笆搓,兩個(gè)都彈出堆頂相加除2. 否則哪個(gè)堆多一個(gè)元素取對(duì)應(yīng)堆元素性湿。
67. 二叉樹的序列化與反序列化
按層遍歷纬傲,先把缺的左節(jié)點(diǎn)或者右節(jié)點(diǎn)補(bǔ)空,然后按層訪問放入數(shù)組中肤频,接著反序列就好
68.#### 區(qū)域和檢索 - 數(shù)組可修改
indexTree. 下標(biāo)從1開始叹括,tree更新的時(shí)候,tree[i]更新宵荒,并且tree[i]+右邊二進(jìn)制1更新汁雷,持續(xù)+右邊1更新。sum的時(shí)候骇扇,tree[i]+ (tree[i]-右邊二進(jìn)制1的數(shù)據(jù))
69#### 四數(shù)相加 II
分治思想摔竿,先遍歷2個(gè)數(shù)組,計(jì)算所有組合相加和出現(xiàn)的次數(shù)map少孝,遍歷后面2個(gè)數(shù)組继低,所有組合中,一個(gè)一個(gè)判斷是否在前面加工的map中出現(xiàn)相反數(shù)稍走,如果是收集結(jié)果袁翁。
70.#### 計(jì)算右側(cè)小于當(dāng)前元素的個(gè)數(shù)
放棄
71. #### 零錢兌換
定義dp[i]為湊齊i元需要的最少硬幣,那么dp[i]=min(各個(gè)硬幣分別必需出現(xiàn)的最小值dp[i-coin[j]]).
72.#### 擺動(dòng)排序 II
排序婿脸,然后按中間分隔粱胜,然后把后面部分的依次插入前面部分的中間。
73.#### 奇偶鏈表
奇數(shù)節(jié)點(diǎn)單獨(dú)生成一個(gè)鏈表狐树,偶數(shù)節(jié)點(diǎn)單獨(dú)生成一個(gè)鏈表焙压,然后把鏈表連起來。
74.#### 矩陣中的最長遞增路徑
定義一個(gè)函數(shù)process(int[][]matrix, int i, int j)表示從i,j出發(fā)的最長路徑抑钟。里面遞歸從上下左右走涯曲。 遞歸會(huì)比較耗時(shí),定義一個(gè)dp[i][j]在塔,記錄從i,j出發(fā)的最長路徑幻件。process方法先判斷dp[i][j]是否有值,有的話蛔溃,直接返回绰沥,規(guī)避重復(fù)計(jì)算。
75.#### 遞增的三元子序列
問題等價(jià)于贺待,nums[i]左邊的最小值是否小于nums[i], 右邊的最大值是否大于nums[i]. 構(gòu)建2個(gè)數(shù)組徽曲,最小值數(shù)組和最大值數(shù)組。
76. 至多包含 K 個(gè)不同字符的最長子串
滑動(dòng)窗口:只要窗口內(nèi)元素個(gè)數(shù)小于k就不斷擴(kuò)張窗口麸塞,隨后如果大于k就不斷收縮窗口
77.#### 前 K 個(gè)高頻元素
遍歷數(shù)組秃臣,統(tǒng)計(jì)每個(gè)數(shù)字的個(gè)數(shù),當(dāng)做一個(gè)對(duì)象(兩個(gè)屬性喘垂,一個(gè)值甜刻,一個(gè)統(tǒng)計(jì)次數(shù))绍撞。構(gòu)建小根堆,小根堆大小為k得院,
78. #### 兩整數(shù)之和
改成位運(yùn)算傻铣,a^b為無進(jìn)位相加,a&b<<右移一位祥绞,直到進(jìn)位信息為0.
79.#### 有序矩陣中第 K 小的元素
構(gòu)建小根堆非洲,小根堆的元素從0,0開始,0,0彈出蜕径,把右邊和下邊的數(shù)據(jù)進(jìn)入小根堆两踏。依次彈出堆頂,然后把彈出元素的右邊和下邊進(jìn)入堆兜喻。
80#### O(1) 時(shí)間插入梦染、刪除和獲取隨機(jī)元素
兩個(gè)map,第一個(gè)k是值朴皆,v是第幾次進(jìn)來的帕识,size初始化為0,第二個(gè)mapk是位置遂铡,v是值肮疗。第二個(gè)map的k要保證連續(xù),如果remove元素扒接,末尾元素挪動(dòng)到空的位置伪货。
81.#### 打亂數(shù)組
隨機(jī)選擇一個(gè)數(shù)字與N-1交換,然后隨機(jī)選擇一個(gè)數(shù)字(在0-n-2區(qū)間)與N-2交換
82.#### 字符串中的第一個(gè)唯一字符
統(tǒng)計(jì)每一個(gè)字符出現(xiàn)的次數(shù)钾怔,用int[]256數(shù)組表示碱呼。 遍歷字符串,發(fā)現(xiàn)哪個(gè)字符的統(tǒng)計(jì)次數(shù)為1即是結(jié)果蒂教。
83.#### 最長有效括號(hào)
子串問題巍举,以什么什么結(jié)尾脆荷。 以i結(jié)尾的最長子串凝垛,為i-1位置的最長,考慮這個(gè)最長占的長度前一個(gè)字符是否為(蜓谋。如果是再+2梦皮,然后再加前一個(gè)的dp值。
84.#### 組合總和
遞歸函數(shù)(arr, index,target),target要湊的數(shù)桃焕,index表示只能使用0-index的數(shù)剑肯,arr是所有數(shù)字。
85. #### 最大正方形
dp[i][j]必需以這個(gè)ij作為右下角的情況下最大的正方形观堂。dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;
86. #### 翻轉(zhuǎn)二叉樹
遞歸反轉(zhuǎn)让网,先反轉(zhuǎn)右節(jié)點(diǎn)呀忧,然后把右節(jié)點(diǎn)賦給左節(jié)點(diǎn)。然后反轉(zhuǎn)左節(jié)點(diǎn)賦值給右節(jié)點(diǎn)溃睹。
87.#### 打家劫舍 III
節(jié)點(diǎn)x的最佳收益而账,1)不搶x,左子樹不搶和搶收益的最大值+右子數(shù)搶與不搶的最大值因篇,4個(gè)值里面取一個(gè)泞辐。2)搶x,x的收益+不搶左子樹和不搶右子樹的最大值竞滓。這里說的左子樹不搶是指左子樹的頭結(jié)點(diǎn)不搶咐吼。
88.#### 字符串解碼
用棧