今天在qq群了看到了这个题目,觉得用单调栈的解法挺好,可以在o(n)内搞定,特意记录下来

首先明确单调栈的含义:

栈是FILO的,栈的所有操作都是在栈顶进行。

单调性指的是当前栈中存储的元素是严格的递增或者递减。

递增:栈中元素从栈顶到栈底是严格递增的; 递减:栈中元素从栈顶到栈底是严格递减的。

举例:先后入栈的元素假设为9,3,10,1,15。。

考虑递增栈:

初始时,栈为空;

9入栈,栈当前为(9)

3入栈,栈不变

10入栈,9出栈,栈当前为(10)

1入栈,栈不变

15入栈,10出栈,栈当前为(15)

本题目解读:(群中出题者给的例子)

举例:

输入={1, 4, 2, 3}

初始标记都是0={0, 0, 0, 0}

取子区间[1, 4] 最大数是4 所以4做一次标记 标记变为{0, 1, 0, 0}

子区间[1, 3] 最大数还是4 {0, 2, 0 ,0}

[1, 2] {0, 3, 0, 0}

……

这样遍历所有的n*(n-1)/2子区间之后 输出当前标记数组即可
 
解题思路:依次遍历每个数,利用单调栈的思路,找到每个数前面第一个比它大的数,再找到后面第一个比它大的数。然后直接计算当前数对应的结果。。
比如说:{5,1, 4, 2, 3,6}
假设当前遍历到了数4,则前面第一个比它的是5,后面第一比它大的是6,显然,当某个子序列最大值为4时,这个子序列不能包含5和5前面的数,也不能包含6和6后面的数,所以直接考虑区间{1,4,2,3}中4能作为最大数的子序列个数count,count即为4对应的最后结果。
计算公式:假设4前面数的个数为m(这些数均小于4),4后面的个数为n(这n个数均小于4),m和n可以由下标计算得到,于是有:
(1)4不作为序列边界的序列数count1 = m * n;
(2)4作为序列边界的序列数count2 = m + n;
所以可知: count = count1+count2 = m*n+m+n;
 
依次计算每个数的count值,即可在o(n)内解决这道题。
 

有n个数(两两不同),对于这n个数的每个连续子序列,把其中最大的一个数标记一次,问最后每个数被标记次数的更多相关文章

  1. hdu 5072 两两(不)互质个数逆向+容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 求n个不同的数(<=1e5)中有多少组三元组(a, b, c)两两不互质或者两两互质. 逆向求解,把 ...

  2. 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)

    题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...

  3. [LeetCode] Couples Holding Hands 两两握手

    N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum numb ...

  4. Leetcode题库——24.两两交换链表中的节点

    @author: ZZQ @software: PyCharm @file: swapPairs.py @time: 2018/10/20 19:49 说明:给定一个链表,两两交换其中相邻的节点,并返 ...

  5. 【Leetcode链表】两两交换链表中的节点(24)

    题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 2- ...

  6. Leetcode 24题 两两交换链表中的节点(Swap Nodes in Pairs))Java语言求解

    题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4,你应该返回 ...

  7. 两两组合覆盖测试用例设计工具:PICT

    两两组合覆盖测试用例设计工具:PICT 2016-08-31 目录 1 成对测试简介2 PICT使用  2.1 安装 PICT  2.2 使用PICT3 PICT算法  3.1 准备阶段  3.2 产 ...

  8. [LeetCode] 24. 两两交换链表中的节点

    题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/ 题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是 ...

  9. [Swift]LeetCode24. 两两交换链表中的节点 | Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1->2->3 ...

  10. 两两交换链表中的节点(java实现)

    题目: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 ...

随机推荐

  1. window.open 使用方法

    window.open(url,name,features,replace); //parameters 解释: URL:需要打开的URL Name:打开URL的标题 Feature:控制窗口大小的参 ...

  2. Jquery的一些简单使用记录

    //平滑滚动到底部 $(".list").scrollTo('100%', '100%', { easing: 'swing' }); //直接滚动至底部(无效果) $('.lis ...

  3. Unity 通过NGUI 完成单摄像机 制作地图

    本次思想主要是通过 Ngui的Scroll View 主要是UIPanel的Clipping属性的Alipha Clip 调节窗口大小,遮蔽地图试地图实现在屏幕的部分显示.此方法的好处是不用担心sha ...

  4. spark学习

    大数据学习纲要,主要针对spark的相关知识的学习,后续会涉及其他大数据相关框架及语言. 1 spark入门: 2.spark 实战部分 3.spark源码解析

  5. ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)

    1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...

  6. .net 更改日期格式

    示例:更改日期格式 下面的代码示例使用 Regex.Replace 方法将 mm/dd/yy 格式的日期替换为 dd-mm-yy 格式的日期. static string MDYToDMY(strin ...

  7. Sublime Text3安装SublimeREPL插件以及快捷键设置

    SublimeREPL是Sublime Text的一个插件,它除了可以使你在ST中运行解释器(REPL),还有对Python语言的特别支持,包括在本地/远程(远程仅在linux/osx平台可用)vir ...

  8. 自定义Chrome 背景色 (FF需要User Styles插件)

    Chrome有个自定义背景色的文件  Custom.css 默认里面什么字都没写 html, body {background-color: #e0dcc0!important;}      这个颜色 ...

  9. 转:alphaImageLoader滤镜加载后 链接不能点击

    我是一个很少使用IE滤镜,也是一个不赞成使用IE滤镜的前端工程师.不过今天有一个朋友给我发来了一个有关于IE6的BUG,就是在IE6中使用了AlphaPNG透明的IE滤镜之后,a链接不能够点击.具体情 ...

  10. [置顶] 使用mongofiles操作GridFS

    使用mongofiles操作GridFS GridFS描述: GridFS,看起来像一种文件系统,其实是一种数据库用法.主要用来在数据库中存储二进制大文件.可以统一用数据库处理数据,而无需借助外部的文 ...