生活随笔
收集整理的這篇文章主要介紹了
2月刷题记录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態規劃
NC128 接雨水問題(雨水數量=裝滿水的容器面積maxArr-容器本身面積arr,而這個裝滿水的容器數組,規律是遞增再遞減) NC183 最長公共子數組(二維dp,相等則左上方的數+1,不相等則為0,還要用一個max來維護最大的長度) NC59 矩陣的最小路徑和(從上方和左方取一個較小的dp值,加上當前值) BM66 最長公共子串(不相等直接為0,相等的話取左上方的值+1,不斷更新max和所在的row和col) BM67 求路徑(由于只能向右走和向下走,dp[][]中的值可以通過其上方和左方的值相加獲得) BM93 盛水最多的容器(雙指針,只需遍歷一次,哪邊高度小,就把哪邊指針往中間移,才有機會獲得更大面積) BM64 最小花費爬樓梯(dp定義為到達這個臺階準備再向上走的最小花費。當走到倒數第一個或倒數第二個臺階,就可到達頂部,所以是返回這兩者的較小值) BM78 打家劫舍(一)(如果偷第i家,就不能偷第i-1家,最大收益為dp[i-2]+nums[i]。如果不偷第i家,就可以偷第i-1家,最大收益為dp[i-1]) BM79 打家劫舍(二)(和(一)的區別是偷第一家就不能偷最后一家,偷了最后一家就不能偷第一家。可以分兩次進行dp再取較大值) BM81 買賣股票的最好時機(二) (和(一)的區別是可以多次買賣。因此遍歷一遍數組,只要prices[i]大于prices[i-1],就加上這一段的收益(表示在prices[i-1]買入,在prices[i]賣出),遍歷完即可得到最大收益。) BM82 買賣股票的最好時機(三)(先從右向左遍歷獲得第二次交易的最大收益,具體做法是用f[i]記錄從i點到之后的最大收益。再從左向右計算第一次交易的最大收益,具體做法是從以min價格買入,price[i]價格賣出, result = Math.max(result, prices[i] - min + f[i]);)
堆
BM48 數據流中的中位數(小頂堆存較大一半的值,大頂堆存較小一半的值。為了保證有序:長度相等時,先放進大頂堆,再從大頂堆彈出一個元素放入小頂堆。長度不相等時,先放進小頂堆,再從小頂堆彈出一個元素放入大頂堆。取中位數時:長度相等時,取大小頂堆的堆頂的平均數,長度不相等時,小頂堆的堆頂就是中位數 )
二叉樹
BM30 二叉搜索樹與雙向鏈表(按中序遍歷的順序把整個鏈表連起來,root用來標記整棵樹最左邊的結點。遞歸左子樹,連接pre和當前結點,遞歸右子樹,返回root)
二分
NC160 二分查找-I(兩種模板,背熟) NC74 數字在升序數組中出現的次數(運用微妙的 + 0.5 和 - 0.5,使用二分法找出數組中第一個大于k和最后一個小于k的數的下標,相減就可以獲得k在數組中的長度) NC105 二分查找-II(升序數組中找第一個和target相等的數,這種一般是用while(left<right)的模板) NC48 在旋轉過的有序數組中尋找目標值(比較nums[start]和nums[mid]可以知道是前半部分還是后半部分有序,若nums[start]<=nums[mid],且nums[start]<=target<nums[mid] 則在前半部分找。后半部分有序同理) NC32 求平方根(mid<=x/mid&&(mid+1)>x/(mid+1)) NC71 旋轉數組的最小數字(i和j分別指向數組的兩頭,m指向中間。array[m]和arr[j]比就可以得出旋轉點在m的左側還是右側,然后不斷縮小i和j的范圍。當i==j時就指向了最小數字(旋轉點)) NC254 合法的三角形個數(先選出兩條邊,再用二分法找符合條件的第三邊。) NC164 最長上升子序列(二)(在動態規劃03中做過最基礎的LIS,同樣的題目,但這道題要求時間復雜度是nlogn,因此需要結合二分來做。動態規劃的dp[i]含義有變化:dp[i]存儲的是長度為i+1的子序列的盡可能小的結尾值。遍歷a[i]的時候,如果a[i]比dp的最后一個值大:把a[i]加入到dp的結尾。如果a[i]比dp的最后一個值小/相等:a[i]就可以替換掉dp中的某個值,但換哪一個?就要用二分法找到第一個大于等于a[i]的值) leetcode 35. 搜索插入位置(兩種模板) leetcode 34.在排序數組中找到元素的第一個和最后一個位置 (兩種模板) NC91 最長上升子序列(三)(dp[i]–以arr[i]為結尾的最長子序列長度,maxEnd[i]–長度為i+1的子序列的最小尾元素,二分法用來在arr中找到第一個大于等于t的數的位置。比較難) leetcode 74. 搜索二維矩陣(這一題每一行都是升序的,而且每一行的開頭大于前一行的結尾。 所以可以對行和列做二分,先找到target所在行,再找到target所在列。二分的時候要找的是最后一個小于等于target的位置)
回溯
BM55 沒有重復項數字的全排列(做選擇,遞歸,撤銷選擇) BM56 有重復項數字的全排列(加入mark數組,排除不合法路徑 if(mark[i]||i>0&&num[i]==num[i-1]&&!mark[i-1]) continue;)
基礎數學
NC79 丑數(忘記了)
模擬
NC57 反轉數字(反轉后的數字可能用int存不下,先用long來存。while(x!=0){n=n*10+x%10;x=x/10;})
數組
NC36 在兩個長度相等的排序數組中找到上中位數(雙指針) NC86 矩陣元素查找(貪心法,從左下角的元素開始,比x小則往右走,比x大則往上走,每走一步都可以剔除掉一行或一列) NC202 長度最小的連續子數組(雙指針,還沒有達到目標值,向右擴展,已經達到目標值,向左收縮) NC252 多數組中位數(和NC36差不多也是雙指針,但這題的兩個數組長度不同,而且要取的是下中位數(指在兩個數組的數個數在偶數時取更小的),mid=(m+n+1)/2) leetcode 240. 搜索二維矩陣 II(和NC86類似,左下角開始搜索) NC283 數組中重復的數字(先排序,再遍歷) NC52 數組中只出現一次的兩個數字(哈希表,出現第二次的數 從map中刪除) BM20 數組中的逆序對(歸并排序+計算逆序對) BM53 缺失的第一個正整數(數組中的n個數全部存進哈希表,然后從開始檢查有沒有1,2,3,。。。n,如果發現缺失,就返回它。如果都有,就返回n+1) BM97 旋轉數組 (注意移動位數m可能會超過數組長度n,所以計算位置是要取模的newArr[(i+m)%n]=a[i];) BM98 螺旋矩陣(從最外圍開始走到最中心的點。上面從左到右,左面從上到下,下面從右到左,左面從下到上)
貪心
BM95 分糖果問題(從左向右遍歷一次,從右向左遍歷一次)
棧
NC90 包含min函數的棧(用到輔助棧,將node和minstack的棧頂比較,哪個小就push哪個進minstack,minstack的棧頂永遠保存當前stack的最小元素) NC115 棧和排序(用tmp數組存i-n之間最大的數,遍歷a數組放入棧,只要棧頂的數比tmp[i+1]大,就彈出來放到res) NC157 單調棧 NC175 合法的括號字符串(遍歷字符串是用來處理右括號的:見到右括號,先匹配左括號,沒有左括號再匹配星號。如果發現有無法匹配的右括號,直接返回false。檢查棧是用來處理左括號的:不斷彈出兩個棧,一個左括號匹配一個星號(滿足左括號在前,星號在后)。如果發現左括號的索引比星號大,直接返回false。最后左括號棧空,才能返回true。) NC208 每日溫度(單調棧。要找到每個數右邊第一個比它大的數,并計算它們倆的差值,可以用一個遞減的單調棧,每遍歷一個數,與棧頂比較,比棧頂小則直接入棧,比棧頂大則不斷讓棧頂先彈出,記錄彈出位置為pre,當前為i,則差值為i-pre) NC216 逆波蘭表達式求值(遇到一個符號則計算前兩個數??梢杂脳=鉀Q。) NC209 最短無序連續子數組(nums[i]滿足大于等于左邊的最大值,小于等于右邊的最小值,這個數在數組中就是不需要移動位置的。所以要從左到右遍歷記錄當前maxleft,從右到左遍歷記錄當前minright,找到無序的左邊界和右邊界,return r-l+1)
總結
以上是生活随笔 為你收集整理的2月刷题记录 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。