1. Minimum Window Substring

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).

Example:

Input: S = "ADOBECODEBANC", T = "ABC"
Output: "BANC"

Note:

  • If there is no such window in S that covers all characters in T, return the empty string "".
  • If there is such window, you are guaranteed that there will always be only one unique minimum window in S.

思路

利用HashMap存储T中的每个字符,及其出现频率,先在S中找包含T的的第一个Window Substring,找到了后因为可能不是最小的所以还是要从左往右遍历找,只不过这是有点技巧的找。判断这个window substring的最左字符,如果不是在T中的直接删除,继续判断它的下一个位置,如果是在T中的话也删除它,不过这删除后下一步我们要转到window substring的最右边去寻找我们删除掉的字符,如果找到则构成新的window,再重复相同步骤,过程中记录windows的最小长度,如果找不到则表明后面没有能包含T的window substring了,也就是找到了所有包含T的Window Substring的情形。

    1. create a hashmap for each character in t and count their frequency in t as the value of hashmap.
    2. Find the first window in S that contains T.
    3. Checking from the leftmost index of the window and to see if it belongs to t. The reason we do so is that we want to shrink the size of the window.
      3-1) If the character at leftmost index does not belong to t, we can directly remove this leftmost value and update our window(its minLeft and minLen value)
      3-2) If the character indeed exists in t, we still remove it, but in the next step, we will increase the right pointer and expect the removed character. If find so, repeat step 3.

代码

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.


Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].


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;
}
}

LeetCode解题报告—— Minimum Window Substring && Largest Rectangle in Histogram的更多相关文章

  1. 【LeetCode】76. Minimum Window Substring

    Minimum Window Substring Given a string S and a string T, find the minimum window in S which will co ...

  2. LeetCode之“动态规划”:Maximal Square && Largest Rectangle in Histogram && Maximal Rectangle

    1. Maximal Square 题目链接 题目要求: Given a 2D binary matrix filled with 0's and 1's, find the largest squa ...

  3. LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)

    84. 柱状图中最大的矩形 84. Largest Rectangle in Histogram

  4. 【一天一道LeetCode】#76. Minimum Window Substring

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  5. 【LeetCode】76. Minimum Window Substring 最小覆盖子串(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 日期 题目地址: https://leet ...

  6. 【LeetCode练习题】Minimum Window Substring

    找出包含子串的最小窗口 Given a string S and a string T, find the minimum window in S which will contain all the ...

  7. LeetCode第[84]题(Java):Largest Rectangle in Histogram(最大的矩形柱状图)

    题目:最大的矩形柱状图 难度:hard 题目内容: Given n non-negative integers representing the histogram's bar height wher ...

  8. LeetCode: Largest Rectangle in Histogram 解题报告

    Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...

  9. Minimum Window Substring @LeetCode

    不好做的一道题,发现String Algorithm可以出很多很难的题,特别是多指针,DP,数学推导的题.参考了许多资料: http://leetcode.com/2010/11/finding-mi ...

随机推荐

  1. BZOJ3782 上学路线 【dp + Lucas + CRT】

    题目链接 BZOJ3782 题解 我们把终点也加入障碍点中,将点排序,令\(f[i]\)表示从\((0,0)\)出发,不经过其它障碍,直接到达\((x_i,y_i)\)的方案数 首先我们有个大致的方案 ...

  2. 《Linux内核设计与实现》读书笔记——第一二章

    <Linux内核设计与实现>读书笔记——第一二章 第一章 Linux内核简介 1.1 Unix的历史 简洁:仅提供系统调用并有一个非常明确的设计目的. 抽象:Unix中绝大部分东西都被当做 ...

  3. Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)

    这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...

  4. 音视频处理之H264编码标准20170906

    一. H264基础概念 1.名词解释 场和帧 :    视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片:             每个图象中,若干 ...

  5. omnet++4.0安装使用

    http://my.oschina.net/u/2269841/blog/423659 本文主要借鉴该文章在此对作者表示由衷的感谢http://blog.csdn.net/xiaobei4929/ar ...

  6. Android的静默安装

    原文 Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安 ...

  7. python中拷贝对象的区别

    一.赋值.引用 在python中赋值语句总是建立对象的引用值,而不是复制对象.因此,python变量更像是指针,而不是数据存储区域 这点和大多数语音类似吧,比如C++.Java等 1.先看个例子: v ...

  8. JS DOM之表格操作

    一个能给添加行的表格 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...

  9. MagicB.0—怎样设置电脑自动关机?

    天太晚了,该睡觉了,可是你的东西也许正在下载,软件正在更新,总之电脑还有一些工作没有完成,又不需要你人为的守着,随他去吧!可是电脑已经工作了一天了,它也要休息一下,再者也不能浪费电力资源呀,那么就来使 ...

  10. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...