Leetcode之貪心法

2021-10-04 07:42:16 字數 2806 閱讀 8299

目錄

1.gas-station

2.jump-game

3.jump-game-ii

4.minimum-window-substring

5.maximum-subarray

6.maximal-rectangle

題目:環形路上有n個加油站,第i個加油站的汽油量是gas[i]。你有一輛車,車的油箱可以無限裝汽油。從加油站i走到下乙個加油站(i+1)花費的油量是cost[i],你從乙個加油站出發,剛開始的時候油箱裡面沒有汽油。求從哪個加油站出發可以在環形路上走一圈。返回加油站的下標,如果沒有答案的話返回-1。注意:答案保證唯一。

分析:從最後乙個加油站start開始出發,如果油量充足,可以一直往前走end++;如果油量不充足,向後尋找新的出發點即start--,這樣就可以利用已有的計算的結果。最終start==end時,也就是車已經走完一圈了,如果這時有剩餘量,那麼從該起始點出發就能到達終點。

public int cancompletecircuit(int gas, int cost) 

else

}return rest >= 0 ? start:-1;

}

題目:給出乙個非負整數陣列,你最初在陣列第乙個元素的位置,陣列中的元素代表你在這個位置可以跳躍的最大長度,判斷你是否能到達陣列最後乙個元素的位置。例如:a =[2,3,1,1,4], 返回 true;a =[3,2,1,0,4], 返回 false.

分析:用max來標記能到達的最遠處的點,遍歷整個陣列,如果能到達該點,計算從該點出發能到達的最遠點從而更新max。

public boolean canjump(int a) 

if(max >= a.length - 1)

return true;

return false;

}

題目:給出乙個非負整數陣列,你最初在陣列第乙個元素的位置,陣列中的元素代表你在這個位置可以跳躍的最大長度,你的目標是用最少的跳躍次數來到達陣列的最後乙個元素的位置。例如:給出陣列 a =[2,3,1,1,4],最少需要兩次才能跳躍到陣列最後乙個元素的位置。(從陣列下標為0的位置跳長度1到達下標1的位置,然後跳長度3到陣列最後乙個元素的位置)

分析:計算每一點能到達的最遠的地方,遍歷從當前點能到達的每個點,若該點還沒到達過,到達該點的步數為到達當前點步數+1。用乙個陣列來儲存到達該點所需的最小步數,第一次到達終點的步數肯定是最小值。

public int jump(int a) 

if(dp[len-1] != 0)//第一次到達終點即為最小值

return dp[len-1];

}return -1;

}

題目:給出兩個字串s和t,要求在o(n)的時間複雜度內在s中找出最短的包含t中所有字元的子串。例如:s ="adobecodebanc",t ="abc",找出的最短子串為"banc".

分析:滑動視窗。先統計出子串t各字元的個數,可以存在hashmap中(一般輸入字母串的字元只有 128 個,可以用大小為128的陣列來代替hashmap)。然後再遍歷s串,初始化begin=end=0,對於s中的每個遍歷到的字母,都在 hashmap 中的對映值減1,如果減1後的對映值仍大於等於0,說明當前遍歷到的字母是t串中的字母,使用乙個計數器 cnt,使其自減1,當計數為0時,說明begin到end之間已包含t中所有字元,記錄視窗長度w;然後begin開始後移移除元素,直到移除的字元是t中的字元則停止,此時t中有乙個字元沒被包含在視窗;繼續後移end,直到begin到end之間包含t中所有字元,重新記錄最小的視窗;迴圈直到end到s中的最後乙個字元。

public string minwindow(string s, string t) 

if(a[s.charat(start)] == 0)//視窗左邊開始移除元素

count++;

a[s.charat(start++)]++;}}

if(minlen == s.length() + 1)

return "";

return s.substring(head,head + minlen);

}

題目:請計算給出的陣列(至少含有乙個數字)中具有最大和的子陣列(子陣列要求在原陣列中連續)。例如:給出的陣列為[−2,1,−3,4,−1,2,1,−5,4],子陣列[−2,1,−3,4,−1,2,1,−5,4],具有最大的和:6.  拓展:如果你已經提出了o(n)的解決方法,請嘗試使用分治演算法來解決這道題。這道題分治的解法更巧妙一些。

分析:最簡單的方法是使用貪心法,見劍指offer面試題42 

另外還可以用分治法解決,見藍橋杯分治法與動態規劃例2 

題目:給出乙個只包含0和1的二維矩陣,找出最大的全部元素都是1的長方形區域,返回該區域的面積。

分析:把矩陣沿著某一行切下來,然後把切的行作為底面,將自底面往上的矩陣看成乙個直方圖,直方圖的中每個項的高度就是從底面行開始往上連續為1的數量。這樣就把題轉化成求直方圖中最大矩陣面積問題了,largest-rectangle-in-histogram見leetcode之棧leetcode5 

public int maximalrectangle(char matrix) 

int val = largestrectanglearea(height);

if(max < val)

max = val;

}return max;

}public int largestrectanglearea(int height)

}return max;

}

貪心法 LeetCode376 擺動序列

題目 擺動序列 如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差 如果存在的話 可能是正數或負數。少於兩個元素的序列也是擺動序列。例如,1,7,4,9,2,5 是乙個擺動序列,因為差值 6,3,5,7,3 是正負交替出現的。相反,1,4,7,2,5 和 1,7,4,5...

貪心法 LeetCode 55 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最後乙個位置。示例 2 輸入...

演算法 貪心法

動態規劃在某一步決定優化函式的最大或者最小值時候,需要考慮子問題的優化函式值,從中選出最優的結果。貪心法 也是多不判斷,不考慮子問題的計算結果,根據當時情況採取 只顧眼前的 貪心策略決定取捨,工作量少於動態規劃很多,更具效率 可導致區域性最優化而不是全域性優化 n項活動,使用同乙個禮堂問題 si 和...