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

随机推荐

  1. NYOJ 734

    奇数阶魔方 描述 一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方.n为奇数时我们有1种构造方法,叫做“右上方” ,例如下面给出n=3,5,7 ...

  2. Android二维码功能实现,在程序内嵌入ZXing项目

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9526247 最近二维码真是越来越火了,随便电视上.网络上.商场里,到处都是二维码. ...

  3. 使用 JDBC 调用函数 &amp; 存储过程

    /** * 如何使用 JDBC 调用存储在数据库中的函数或存储过程 */ @Test public void testCallableStatment() { Connection connectio ...

  4. hdu 5029 Relief grain(树链剖分+线段树)

    题目链接:hdu 5029 Relief grain 题目大意:给定一棵树,然后每次操作在uv路径上为每一个节点加入一个数w,最后输出每一个节点个数最多的那个数. 解题思路:由于是在树的路径上做操作, ...

  5. java设计模式之桥接模式

    桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的 ...

  6. 自动生成数学题型二(框架struts2)题型如((a+b)*c=d)

    1. 生成题目 1.1 生成单个题目 public static String[] twoOperatorAndOperator(int num1, int num2) { double first ...

  7. 第6章 演示服务器和测试 - Identity Server 4 中文文档(v1.0.0)

    您可以使用您喜欢的客户端库尝试IdentityServer4.我们在demo.identityserver.io上有一个测试实例.在主页面上,您可以找到有关如何配置客户端以及如何调用API的说明. 此 ...

  8. Skype 使用小技巧

    原文发布在个人独立博客上,链接:http://maxpeng.vipcloud.me/2016/09/01/skype-tricks-tips/   Skype 作为一个即时聊天工具,相信大家都不陌生 ...

  9. C# Winform 按回车键查找下一个可设置焦点的组件

    private void frmLogin_KeyPress(object sender, KeyPressEventArgs e) { //按回车键查找下一个可设置焦点的组件. if (e.KeyC ...

  10. Java课程作业之动手动脑(三)

    1.以下代码为何无法通过编译?哪儿出错了? 在Foo类中已经有了一个Foo的含参构造方法,所以在定义Foo类对象时不能使用new Foo()方法.在Foo类中再写一个无参构造方法,就能编译了. 如果类 ...