Showing posts with label Monotone Queue. Show all posts
Showing posts with label Monotone Queue. Show all posts

JZOJ 1772 - Holiday


https://www.codetd.com/article/2798845
经过几个月辛勤的工作,FJ决定让奶牛放假。假期可以在1…N天内任意选择一段(需要连续),每一天都有一个享受指数W。但是奶牛的要求非常苛刻,假期不能短于P天,否则奶牛不能得到足够的休息;假期也不能超过Q天,否则奶牛会玩的腻烦。FJ想知道奶牛们能获得的最大享受指数。
Input
第一行:N,P,Q.
第二行:N个数字,中间用一个空格隔开,每个数都在longint范围内。
Output
一个整数,奶牛们能获得的最大享受指数。
Sample Input
5 2 4
-9 -4 -3 8 -6
Sample Output
5
Data Constraint
50% 1≤N≤10000
100% 1≤N≤100000
1<=p<=q<=n
Hint
选择第3-4天,享受指数为-3+8=5。
看到区间的问题首先肯定是想到求前缀和,我们把[1,k]的和记为sum[k],可以得到sum[i] = sum[i - 1] + a[i],[l,r]的和即为sum[r] - sum[l - 1](这里视sum[0] = 0)。我们假设选择的区间为[l,r]且r固定,可知r−q+1≤l≤r−p+1r−q+1≤l≤r−p+1,若要使[l,r]区间的值最大,则sum[l - 1]需最小,才可使得sum[r] - sum[l - 1]最小,当i右移一位到i+1,因为p,q为给定不变的值,对应寻找最小sum[l-1]的区间也右移一位,与上题同。
如下图,当p=3,q=5时:
这里写图片描述
关于单调队列的运用还有很多,例如斜率优化DP等等。总而言之,使用单调队列优化DP,那么必会有求i之前某个范围的极值的操作,这类DP的方程通常为:
F[i]=min(F[j]+a[i]:j<i)F[i]=min(F[j]+a[i]:j<i)
a[i]是与j无关的数。
int n,p,q,l,r,head = 1,tail = 0,ans = -2147483647;
int que[100001],a[100001];
long long sum[100001];

int max(long long a,long long b)
{
    return a > b ? a : b;
}

int main()
{
    sum[0] = 0;
    scanf("%d %d %d", &n, &p, &q);
    for (int i = 1;i <= n;i++)
    {
        scanf("%d", &a[i]);
        sum[i] = sum[i-1] + a[i]; //记前缀和
    }
    for (r = p;r <= n;r++)
    {
        while (head <= tail && sum[que[tail]-1] >= sum[r-p]) tail--; //更优的sum[l - 1]予以插队
        que[++tail] = r+1-p; //入队
        while (head <= tail && que[head] < r+1-q) head++; //不处于维护范围内的出队
        ans = max(ans, sum[r]-sum[que[head]-1]); //更新答案
    }
    printf("%d\n", ans);
    return 0;
}

        前缀和 + dp + 单调队列。

        写了树状数组。。。。但是树状数组求区间和比前缀和要慢啊。。。

        首先前缀和,sum[i] = sum[i - 1] + sum[i – 2];所以对于区间[i,j],区间和sum(i,j) = sum[j] – sum[i],其中j – q <= i <= j – p;这时可以发现,若要sum(i,j)尽量大,那么=sum[i]要尽量小,这时要用单调递增队列维护i的区间,队列中存sum数组的下标。

        单调队列满足两个性质:

            1.单调队列必须满足从队头到队尾的严格单调性。

            2.排在队列前面的比排在队列后面的要先进队。

        元素进队列的过程对于单调递增队列,对于一个元素a 如果 a > 队尾元素,那么直接将a扔进队列;如果 a <= 队尾元素 则将队尾元素出队列,直到满足 a 大于队尾元素即可。

        枚举j从p到n,即枚举右端点,对于每个枚举的右端点,更新单调队列,首先要保证head始终<= tail,当队尾元素的值sum[que[tail]] > 当前要进队的元素的值sum[j – p]时,队尾的标记tail要前移,tail--;之后队尾元素更新为j – p;对于队首,要保证q[head] > j – q,所以head要++,直到满足。这样更新完成后,队首元素的值就是最小的了,此时在ans与sum[j] – sum[q[head]]间取max。
动态规划,先求一个前缀和sum,ans=max(ans,sum[i]-sum[k])(i-p<=k<=i-q)
根据上式,若ans最大,则sum[k]尽量小,所以单调队列维护区间i-q~i-p的最小值即可。
lon n,P,Q,ans=inf,tmp,sum[maxn];
lon head=1,tail,q[maxn];
int main()
{
    cin>>n>>P>>Q;
    for(int i=1;i<=n;i++)
    {
        cin>>tmp;
        sum[i]=sum[i-1]+tmp;
    }
    for(int i=P;i<=n;i++)
    {
        while(head<=tail&&sum[i-P]<sum[q[tail]])
        tail--;
        q[++tail]=i-P;
        while(head<=tail&&q[head]<i-Q)
        head++;
        ans=max(ans,sum[i]-sum[q[head]]);
    }
    cout<<ans;
    return 0;
}

单调队列 - 有限制的最大和问题

  scanf("%d%d%d",&n,&p,&q);
  for(int i=1; i<=n; i++)
  {
      scanf("%lld",&num[i]);
      num[i]+=num[i-1];
  }

  int ans=0x80000000;
  std::deque<int> deq; //单调队列
  //保存假期的起始点
  //单调队列往往保存的是下标
  for(int i=p; i<=n; i++)
  {
      //单调队列第一步:删去非最优解
      //这一步最重要
      //对于本题而言,如果把之前的数作为起始点还不如把当前点作为起始点,那就删了它
      //如果前几个数的和比i-p对应的数还要大,说明num[j]-num[i-p]比num[j]-num[前几个数]要大
      while(!deq.empty() && num[deq.back()] > num[i-p])
          deq.pop_back();
      //单调队列第二步:保存当前解
      deq.push_back(i-p); //保存起始位置
      //单调队列第三步:删去过时解
      //这一步可以放在任何位置,但必须放在更新答案前
      while(!deq.empty() && deq.front() < i-q)
          deq.pop_front();
      //单调队列第四步:更新答案
      //答案读取的是front,因为根据之前的操作front是最优解
      ans=std::max(ans,int(num[i]-num[deq.front()]));
  }
  printf("%d",ans);

int main()
{
    scanf("%lld %lld %lld", &n, &p, &Q);
    rep(i,1,n)    scanf("%lld", &a),sum[i] = a + sum[i-1];
    rep(i,p,n)
    {
        while(sum[q[tail]] >= sum[i-p] && head <= tail) tail--;//因为i-p处的元素必须入队,所以队中一切比sum[i-p]大的元素必须出队
        q[++tail] = i - p;//把sum[i-p]压入队列
        while(q[head] < i - Q) head++;//因为我们最多只能取到i-q这么长的区间,所以在这个区间之前的所有元素必须出列。
        f[i] = sum[i] - sum[q[head]];
        ans = max(ans, f[i]);
    }
    printf("%lld\n", ans);    
    return 0;
}
X. 
1.线段树   复杂度(nlogn)
2.单调队列 复杂度(n)
具体实现
1.线段树:
首先预处理出来sum前缀和,
对于每一点i,我们只需要找到符合题意范围内最小的即可
并放入线段树中
对去查询每一个点,用线段树去查询i-q+1~i-p+1之间的最小值
然后去更新最大值
2.单调队列:
构造一个单调队列
当枚举到i的时候,用sum[i-p+1]去更新队列

首先,我们想一想怎么算每个“几天内”的最大值,首先想可以暴力,枚举一次天数,再枚举一次i,时间是 O(n2),爆了。
所以我们还要想一想。
前缀和?可以优化……
线段树?能考虑……
这几个小想法组合起来就可以了,但是好像不是很好想。
我们可以枚举第一个休息日的编号i,我们要算从这个第i天开始,往后的P到Q天里快乐指数最大那一天快乐指数是多少,枚举过后取个max就行了。
按这种方式算的话,如何将时间复杂度优化到最小?
考虑前缀和和线段树。
前缀和数组pre维护的是的快乐指数之和,线段树求的是i+P-1 ~ i+Q-1这一段区间的快乐指数前缀和最大值maxn,我们发现maxn-pre[i]就是从这个第i天开始,往后的P到Q天里快乐指数最大那一天快乐指数是多少。
其实求最大值的部分,用st表或者其他的也行,只不过我觉得线段树更好。
总共的复杂度就是O(nlogn)

HDU 3530 - Subsequence


http://acm.hdu.edu.cn/showproblem.php?pid=3530
There is a sequence of integers. Your task is to find the longest subsequence that satisfies the following condition: the difference between the maximum element and the minimum element of the subsequence is no smaller than m and no larger than k.

Input
There are multiple test cases.
For each test case, the first line has three integers, n, m and k. n is the length of the sequence and is in the range [1, 100000]. m and k are in the range [0, 1000000]. The second line has n integers, which are all in the range [0, 1000000].
Proceed to the end of file.

Output
For each test case, print the length of the subsequence on a single line.

Sample Input
5 0 0 1 1 1 1 1 5 0 3 1 2 3 4 5

Sample Output
5 4


给一个序列,t为一个子串中最大值和最小值的差值,要求t在[L,R]之间,求问符合这样的子串最长的长度是多少。
https://blog.csdn.net/Maosghoul/article/details/81204975
首先说一下单调队列的复杂度,是每个数出队入队各一次,复杂度O(n);

下面我们就开始对此题的解法。

我们可以设想,如果有一个,既有标记着位置,又有标记着值得从大到小得队列,和一个从小到大的队列,我们直接比较队列的头部,然后进行出对和入队,这不就可以解决了吗

例如给出一个样例 5 0 0  A[1-n] = {5 , 4 , 2 , 1 , 3}

                               max单调队列       min单调队列

i==1时                             5                        5                                此时满足答案, ans =1;

i==2时                             5                        4(5出4入)             此时由于5 - 4>区间右值0 因此 max队列的头部出列

i==3时                             4                        2 (4出2入)             此时由于4-2>区间右值0  因此max 队列的头部出列

i==4时                             2                         1(2出1入)                 此时由于2-1>区间右值0  因此max 队列的头部出列

i==5时                              3                         1                                 此时由于3-1>区间右值0  因此max 队列的头部出列

然后最后得出的结果是 ans = 1; 输出1;

ps:此题有一个坑 就是没有说区间的m  和  K的相对大小,如果K<m 则此区间不存在 因此输出为 0了;

https://blog.csdn.net/feizaoSYUACM/article/details/77257351
题目是要求一段区间内最大值与最小值的差不低于m不超过k,那么维护一个递增的单调队列和一个递减的单调队列。凡是差值超过k的就往前挪动,满足条件之后每次得到的一个区间,如果符合差值不低于m的条件,更新区间长度的ans值就行了。
只有通过单调队列扫一遍。

维护一个最大值和一个最小值。

保证最大值-最小值时满足上界条件的。

然后如果下界条件满足就更新答案。
http://kugwzk.info/index.php/archives/1594
维护两个单调队列,分别存到当前i的最大值和最小值。用一个bg变量表示当前区间的起点。当队首的两值差大于k,就需要我们舍弃两个单调队列中更靠前的那个位置(这样可以保证队列的长度求得是最长),并且更新bg。如果队首两值差大于等于M就可以更新答案。
http://www.acmsearch.com/article/show/13474
思路:维护两个单调队列,一个单调递增的队列,一个递减的队列,并且维护一个指针p(代表满足当前序列的最左边的端点,开始时赋值为0)。然后分三种情况讨论当值小于m时,这时候队列中肯定不存在成立的值,所有就必须再继续进队,当刚好成立的时候,更新ans,当大于k的时候,这时候就要把单调队列的头指针出队了,然后这时候必须要选择头指针位置小的那个队列的头指针出队,因为你把位置大的出队的话位置小的那个元素有被用到,这时候明显不符合实际,因为位置小的存在,位置大的必定也存在,所以这时候必须把位置小的出队,然后更新指针p = 出队的那个元素位置加1。

这是做的第一道单调队列,这道题目中单调队列里面存的是数组元素的下标,当是它是维护的是数组值的单调性,感觉最重要的一点是队列里面的下标值肯定都是从小到大的,
因为在进队过程中,是把前面不合符的都出队了,所以它所在的位置肯定是最右边的,这样就能保证了i-p是最优答案了,因为p这时候是为队头位置+1,而出队的队头位置是最小的。所以p这是是最小的。
https://saisin.wordpress.com/2011/03/31/hdu-3530-%E5%8D%95%E8%B0%83%E9%98%9F%E5%88%97/
状态表示:F[i]:以i为结束点的序列满足m,k的条件的最大值。如果从后向前扫描统计最大值和最小值,这样时间复杂度为O(n*n).
通过分析发现:
max[i-1,j+1] >= max[i,j] and min[i-1,j+1] <= min[i,j];令p[i,j] = max[i,j] – min[i,j]
即:设p[i,j]随着i的增加,p[i,j]下降;随着j的增加,p[i,j]增加。
1.F[j] = min{i: p[i,j] <= k},i的取值范围,随着j的增加,i值不减。if: p[i,j] > k then:p[i,j+1] >k
2.当得到p[i,j] <= k的最小i后,如果p[i,j] < m 那么 p[i+1,j] <m,即:如果满足k后如果不满足m,那么后面的值都不满足。
通过以上的分析,我们的目标就是找到关于j的p[i,j] <= k的最小i,这个值i值取值范围只增不减。
于是可以使用单调队列来优化,设计一个i值指针,代表对于j可以取的最小值为i。两个单调队列,分别表示i以后到j的最大值和最小值。如果当前的i值,p[i,j] > k,那么取下一个最大值或者最小值,由于要去i值最小,i值增加到两个队列中小的下标。在求最小i值的过程中统计对于每个j的最长序列值。
算法的时间复杂度降到了O(n).
https://xuela-net.iteye.com/blog/1906290
https://www.zybuluo.com/lychee123/note/633946
  1. int a[100005];
  2. int main()
  3. {
  4. int n,m,k,i;
  5. while(~scanf("%d%d%d",&n,&m,&k))
  6. {
  7. for(i=0;i<n;i++)
  8. scanf("%d",&a[i]);
  9. if(m>k)
  10. {
  11. printf("0\n");
  12. continue;
  13. }
  14. deque<int>q1;///维护最大值(从头到尾从大到小)
  15. deque<int>q2;///维护最小值
  16. int last=-1,ans=0;
  17. for(i=0;i<n;i++)
  18. {
  19. while(!q1.empty()&&a[i]>a[q1.back()])
  20. q1.pop_back();
  21. while(!q2.empty()&&a[i]<a[q2.back()])
  22. q2.pop_back();
  23. q1.push_back(i);
  24. q2.push_back(i);
  25. while(!q1.empty()&&a[q1.front()]-a[q2.front()]>k)
  26. {
  27. if(q1.front()>q2.front())
  28. {
  29. last=q2.front();
  30. q2.pop_front();
  31. }
  32. if(q1.front()<q2.front())
  33. {
  34. last=q1.front();
  35. q1.pop_front();
  36. }
  37. }
  38. if(!q1.empty()&&!q2.empty()&&a[q1.front()]-a[q2.front()]>=m)
  39. ans=max(ans,i-last);
  40. }
  41. printf("%d\n",ans);
  42. }
  43. return 0;
  44. }
+

const int MAXN=100010;
int a[MAXN];
int q1[MAXN],q2[MAXN];//q1是维护最大值,q2维护最小值
int n,m,k;


int main()
{
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    while(scanf("%d%d%d",&n,&m,&k)==3)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int ans=0;
        int rear1,front1,rear2,front2;
        rear1=front1=0;
        rear2=front2=0;
        int now=0;
        for(int i=1;i<=n;i++)
        {
            while(front1<rear1 && a[q1[rear1-1]]<a[i])rear1--;
            q1[rear1++]=i;
            while(front2<rear2 && a[q2[rear2-1]]>a[i])rear2--;
            q2[rear2++]=i;
            while(front1<rear1 && front2<rear2 && a[q1[front1]]-a[q2[front2]]>k)
            {
                if(q1[front1]<q2[front2])
                {
                    now=q1[front1];
                    front1++;
                }
                else
                {
                    now=q2[front2];
                    front2++;
                }
            }
            if(front1<rear1 && front2<rear2 && a[q1[front1]]-a[q2[front2]]>=m)
                ans=max(ans,i-now);
        }
        printf("%d\n",ans);
    }
    return 0;
}
http://www.voidcn.com/article/p-mkqjqcob-bnv.html
二分答案,线段树判断答案,check的时候需要判断三种情况:
第一种,t的最大值在[L,R]中;
第二种,t的最大值



NKOJ 2150 广告印刷 - Monotone Queue


Related: LeetCode 84 - Largest Rectangle in Histogram
https://www.cnblogs.com/c1299401227/p/5774479.html
最近,afy决定给TOJ印刷广告,广告牌是刷在城市的建筑物上的,城市里有紧靠着的N个建筑。
afy决定在上面找一块尽可能大的矩形放置广告牌。我们假设每个建筑物都有一个高度,
从左到右给出每个建筑物的高度H1,H2…HN,且0<Hi<=1,000,000,000,并且我们假设每个建筑物的宽度均为1。
要求输出广告牌的最大面积。
【输入文件】
输入文件 ad.in 中的第一行是一个数n (n<= 400,000)
第二行是n个数,分别表示每个建筑物高度H1,H2…HN,且0<Hi<=1,000,000,000。
【输出文件】
输出文件 ad.out 中一共有一行,表示广告牌的最大面积。
【输入样例】
6
5 8 4 4 8 4
【输出样例】
24
思路:
容易想到,要想使面积最大,肯定要将当前广告覆盖的楼房中,高度最小的那个楼房全部印刷上广告。所以,枚举每个建筑物的高度作为广告矩形的高度,求出在该楼房的左侧,有多少栋连续的楼房的高度大于或等于该楼房的高度,右侧同理。然后得到矩形广告的面积,找出最大面积即可

在这里约定,以当前建筑物为矩形高度,向两侧寻找可以印刷的建筑的过程叫做——扩展。
我们来考察从第i个建筑向左扩展的情况,h数组为建筑物高度,下标为1~n:
如果我们知道,向左扩展到极限时的建筑物的下标为j的话,这时,建筑物j是第一个满足h[j]<h[i]的建筑。那么,第i个建筑物向左扩展的建筑物数量为i-j-1。
如果,对h从左向右建立一个单调递增队列mq,h数组的下标为队列元素,在新的建筑物i要入队时,将队尾所有高度大于等于h[i]的元素都出队,新的队尾mq[rear-1](rear指向队尾的下一个位置)刚好是上面所讲的向左扩展的极限下标j,因为入队顺序是从左向右的,而且在极限下标j与当前建筑下标i之间的这些建筑,因为高度大于等于h[i],所有都出队了,mq[rear-1]就刚好是极限下标j。
向右侧扩展是同样的道理,只需要对h从右向左建立一个单调递增队列即可。
为了简化操作,将h[0]和h[n+1]的值都赋为-1。
下面举一个向左侧扩展的例子:

H[]存储建筑物高度,L[]记录向左扩展建筑数量。
     下标    
     0    
     1    
     2    
     3    
     4    
     H[]    
     -1
     9    
     5    
     5    
     -1    
     L[]    





单调递增队列,front和rear分别为队首和队尾指针,rear指向队尾的下一个位置,初始时让0号建筑入队
     指针    
     Front    
     Rear    
    
    
     队列元素    
     0    
    
    
    


1号建筑入队,队尾没有比1号建筑更高的建筑,直接入队,L[1]= 1 - mq[rear-1] - 1,结果如下:
     下标    
     0    
     1    
     2    
     3    
     4    
     H[]    
     -1    
     9    
     5    
     5    
     -1    
     L[]    

     0    




     指针    
     Front    

     Rear    
    
     队列元素    
     0    
     1     
    
    


2号建筑入队,队尾元素为1号建筑,高度为9,比2号建筑高,所以出队,新的队尾元素为0号,计算L[2] = 2 –mq[rear-1] – 1,然后2号建筑入队尾,结果如下
     下标    
     0    
     1    
     2    
     3    
     4    
     H[]    
     -1    
     9    
     5    
     5    
     -1    
     L[]    

     0    
     1    



     指针    
     Front    

     Rear    
    
     队列元素    
     0    
      2     
    
    


3号建筑入队,队尾元素为2号建筑,高度为5,与3号建筑一样高,所以出队,新的队尾元素为0号,计算L[3] = 3 –mq[rear-1] – 1,然后3号建筑入队尾,结果如下:
     下标    
     0    
     1    
     2    
     3    
     4    
     H[]    
     -1    
     9    
     5    
     5    
     -1    
     L[]    

     0    
     1    
     2    
    

     指针    
     Front    

     Rear    
    
     队列元素    
     0    
     3     
    
    


最终结果:
     下标    
     0    
     1    
     2    
     3    
     4    
     H[]    
     -1    
     9    
     5    
     5    
     -1    
     L[]    

     0    
     1    
     2    


 6 int Q[N],h[N],head=0,tail=1,maxar=-1,kzleft[N],kzright[N],n;
 7 void input()
 8 {
 9     scanf("%d",&n);
10     for(int i=1;i<=n;++i)
11       scanf("%d",&h[i]);
12 }
13 void calcleft()
14 {
15     memset(Q,0,sizeof(Q));
16     h[0]=h[n+1]=-1;
17     for(int i=1;i<=n;++i)
18     {
19         while(head<tail&&h[Q[tail-1]]>=h[i])   tail--;
20         kzleft[i]=i-(Q[tail-1]);
21         Q[tail++]=i;
22     }
23 }
24 void calcright()
25 {
26     memset(Q,0,sizeof(Q));
27     head=0;tail=1;
28     Q[0]=n+1;
29     for(int i=n;i>=1;--i)
30     {
31         while(head<tail&&h[Q[tail-1]]>=h[i]) tail--;
32         kzright[i]=Q[tail-1]-i;
33         Q[tail++]=i;
34     }
35 }
36 int find_max_area()
37 {
38     for(int i=1;i<=n;++i)
39     {
40         maxar=max((kzleft[i]+kzright[i]-1)*h[i],maxar);          
41     }
42     return maxar;
43 }
44 int main()
45 {
46     input();
47     calcleft();
48     calcright();
49     printf("%d\n",find_max_area());
50     return 0;
51 }
对于每一个建筑物,要知道往左到哪一个建筑第一个高度比它低,知道往右走哪一个建筑物第一个高度比它低。

可以用dp,也可以用单调队列。

首先从左往右,构造单增队列,这样始终有一个最小值,每加入一个高度h,先把队尾处大于等于它的高度全部删掉。

因为后面的高度,如果高度比h大,那么找到h就停止了,如果高度<=h,那么高度也一定<=删掉的元素。所以被删的元素不需要保留。

如果队列空了,证明h是从1开始到ind[h]的高度最小值。
https://www.jianshu.com/p/a4f2eecb1f89
最终的广告牌一定等于某个建筑物的高度×其能达到的最大长度
现在,建筑物的高度已知,现在只需要知道每个高度能达到的最大长度是多少。由于n是400000,我们只能用O(n)或O(nlogn)的算法。可以使用rmq,在后边的论文中会讲到。
现在讲时间复杂度为o(n)的单调队列的方法。
继续上边的思路,对于每个建筑物,只需要找到其能够扩展到的最大宽度即可。也就是这个建筑物的左右两边的比它低或等于它的建筑物个数。
如何用单调队列呢?
我们从1~n依次进队,维护一个单调递增序列。每次加入元素后维护其单调性,当然这样做必然会使一些元素出队,出队的元素一定要比当前加入的元素大,也就是说当前元素就是出队的元素能在右侧达到的最远的建筑物!
注意,要让h[n+1]=0并且让该元素入队一次(会使当前队列中的所有元素出队),保证每个元素都有其“右极限”的值。
要求“左极限”同理,只需从n~0循环即可,注意0
这道题是对单调队列的变形使用。由于问题的结果具有单调性,很好的利用出队元素的特性.


枚举法,时间复杂度为O(n^2):
 1 int MaxRectArea(void)  
 2 {  
 3     int maxArea = 0;  
 4     int i, j;  
 5     for (i = 0; i < n; i++)  
 6     {  
 7         int count = 1;  
 8         //统计在当前建筑物i的左边,与h[i]相同或更高的建筑物有多少  
 9         for (j = i-1; j >= 0 && h[j] >= h[i]; j--)  
10         {  
11             count++;  
12         }  
13         //右边同理  
14         for (j = i+1; j < n && h[j] >= h[i]; j++)  
15         {  
16             count++;  
17         }  
18         int area = count * h[i];  
19         if (area > maxArea)  
20         {  
21             maxArea = area;  
22         }  
23     }  
24     return maxArea;  
25 }  

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts