1. Minimum Window Substringwindows
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).this
Example:spa
Input: S = "ADOBECODEBANC", T = "ABC" Output: "BANC"
Note:code
""
.思路blog
利用HashMap存儲T中的每一個字符,及其出現頻率,先在S中找包含T的的第一個Window Substring,找到了後由於可能不是最小的因此仍是要從左往右遍歷找,只不過這是有點技巧的找。判斷這個window substring的最左字符,若是不是在T中的直接刪除,繼續判斷它的下一個位置,若是是在T中的話也刪除它,不過這刪除後下一步咱們要轉到window substring的最右邊去尋找咱們刪除掉的字符,若是找到則構成新的window,再重複相同步驟,過程當中記錄windows的最小長度,若是找不到則代表後面沒有能包含T的window substring了,也就是找到了全部包含T的Window Substring的情形。rem
代碼get
class Solution { public String minWindow(String s, String t) { HashMap<Character, Integer> map = new HashMap<Character, Integer>();; for(char c : t.toCharArray()){ if(map.containsKey(c)){ map.put(c, map.get(c)+1); }else{ map.put(c, 1); } } int counter=t.length(), begin=0, end=0, head=0, d=Integer.MAX_VALUE; while(end<s.length()){ // 先找左邊第一個包含T的substring char c_left=s.charAt(end); if(map.containsKey(c_left)){ map.put(c_left, map.get(c_left)-1); if(map.get(c_left)>=0) counter--; } end++; while(counter==0){ // 若是找到,則從substring的左邊考慮 if(end-begin<d){ head=begin; d=end-begin; } char c_right=s.charAt(begin); if(map.containsKey(c_right)){ map.put(c_right, map.get(c_right)+1); if(map.get(c_right)>0) counter++; } begin++; } } return d==Integer.MAX_VALUE? "":s.substring(head, head+d); } }
2. Largest Rectangle in Histogram同步
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.string
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.hash
The largest rectangle is shown in the shaded area, which has area = 10
unit.
Example:
Input: [2,1,5,6,2,3]
Output: 10
思路
解法和trap water那題有點相似,不過得轉換下思惟。仍是利用棧,想到這點了,可是我一直在糾結後輸入的bar後前面bar的組成的rectangle有什麼關係或規律,固然這也是看了這題後最直觀的想法了。這個切入點不是很好解題,這個時候應該換下思路才行,感受犯了和trap water那題同樣的思惟錯誤,最直觀的想法每每只適合循環遍歷,即brute force。利用棧來解這題的話仍是得換個切入點的。
和trap water那題同樣,不去考慮不一樣bar之間的組合情形,而是從單個bar的入手,求包含每一個bar爲最低高度的 rectangle 來考慮。
For every bar ‘x’, we calculate the area with ‘x’ as the smallest bar in the rectangle. If we calculate such area for every bar ‘x’ and find the maximum of all areas, our task is done
至於怎麼計算這個rectangle,其實就和trap water那題計算每一個bar所能trap的water 是差很少的。
代碼
class Solution { public int largestRectangleArea(int[] heights) { Stack<Integer> st=new Stack(); int left=0; int maxArea=0; for(int i=0;i<=heights.length;i++){ int h= (i==heights.length? 0:heights[i]); if(st.isEmpty() || h>=heights[st.peek()]){ st.push(i); }else{ int hi=heights[st.pop()]; left=(st.isEmpty()? -1:st.peek()); maxArea=Math.max(maxArea, (i-left-1)*hi); i--; } } return maxArea; } }