2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 :
子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓。
n<=100000(10^5) n*logn O(N)。
来自腾讯。

答案2021-12-26:

单调栈。从左往右一次单调栈,从右往左一次单调栈。
时间复杂度:O(N)。
额外空间复杂度:O(N)。

代码用golang编写。代码如下:

  1. package main
  2. import "fmt"
  3. func main() {
  4. arr := []int{1, 2, 3, 2, 1}
  5. ret := nums(arr)
  6. fmt.Println(ret)
  7. }
  8. func nums(arr []int) int {
  9. if len(arr) < 2 {
  10. return 0
  11. }
  12. n := len(arr)
  13. values := make([]int, n)
  14. times := make([]int, n)
  15. size := 0
  16. ans := 0
  17. for i := 0; i < len(arr); i++ {
  18. for size != 0 && values[size-1] > arr[i] {
  19. size--
  20. ans += times[size] + cn2(times[size])
  21. }
  22. if size != 0 && values[size-1] == arr[i] {
  23. times[size-1]++
  24. } else {
  25. values[size] = arr[i]
  26. times[size] = 1
  27. size++
  28. }
  29. }
  30. for size != 0 {
  31. size--
  32. ans += cn2(times[size])
  33. }
  34. for i := len(arr) - 1; i >= 0; i-- {
  35. for size != 0 && values[size-1] > arr[i] {
  36. size--
  37. ans += times[size]
  38. }
  39. if size != 0 && values[size-1] == arr[i] {
  40. times[size-1]++
  41. } else {
  42. values[size] = arr[i]
  43. times[size] = 1
  44. size++
  45. }
  46. }
  47. return ans
  48. }
  49. func cn2(n int) int {
  50. return (n * (n - 1)) >> 1
  51. }

执行结果如下:


左神java代码

2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓。 n<=100000(10^5) n*的更多相关文章

  1. 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

    题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...

  2. GreatSQL季报(2021.12.26)

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 自从GreatSQL 8.0.25 于 2021.8.26发布以来,针对MGR的 ...

  3. 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。

    如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和.不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组(即:n + n-1 + ... + 1=n(n+1)/2):而且求一个长度为n的 ...

  4. 给定一个长度为N的数组,找出出现次数大于n/2,n/3的数,要求时间复杂度O(n),空间复杂度O(1)

    先讨论出现次数大于n/2的数字,如果这样的数字存在,那么这个数出现的次数大于其他数出现的次数的总和. 在数组A中,我们定义两个数据集合a1,a2.a1为出现次数大于n/2的数的集合,a2为其余数组成的 ...

  5. hdu 5289 Assignment(给一个数组,求有多少个区间,满足区间内的最大值和最小值之差小于k)

    1.区间是一段的,不是断开的哟 2.代码是看着标程写的 3.枚举左端点,二分右端点流程: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L ...

  6. 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)

    第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...

  7. 双指针之滑动窗口(长度最小的子数组 和 和为s的连续正数序列)

    双指针之滑动窗口 (长度最小的子数组:和为s的连续正数序列) 1, 什么时候使用? (与子数组/字符串 有关的题目)~如果给了某个具体值的target,即用滑动窗口 不然就双指针(一般做法,左边< ...

  8. 笔试算法题(06):最大连续子数组和 & 二叉树路径和值

    出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一 ...

  9. 209. 长度最小的子数组--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/minimum-size-subarray-sum 著作权归领扣网络所有.商业转载请联系官方授权,非商业 ...

  10. 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?

    昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...

随机推荐

  1. Windows10系统快速安装.NET Framework3.5的方法&常见问题处理方法

    Windows10系统快速安装.NET Framework3.5的方法&常见问题处理方法 因为我的win10想了办法来禁止自动更新,就无法照正常办法安装.NET Framework3.5,解决 ...

  2. “==” 与 equals 区别 简化易懂版

    首先,我们只需要看Object中的equals 方法写的是啥 很显然,就是一句话,"==" 与 equals方法作用完全一致. 都是用来比较在内存的首地址,即用来比较两个引用变量是 ...

  3. 4.错误代码C1083

    有的时候在VS中遇到的error C1083: 无法打开**: " * .*": No such file or directory的错误,这里总结了我遇到过的情况: 错误 C10 ...

  4. Spring 的核心组件详解

    Spring 总共有十几个组件,但是真正核心的组件只有三个:Core.Context 和 Bean.它们构建起了整个 Spring的骨骼架构,没有它们就不可能有 AOP.Web 等上层的特性功能. 一 ...

  5. C# 通过StreamWriter输出的TXT流文件,前缀带EF BB BF

    好久没有动笔写博客了,这个小天地被我闲置的放了好久好久,接下来要慢慢捡起来了. 备注:通过C#的StreamWriter类输出一个TXT流文件,供下位机工程师使用,发现打开的16进制文件中,默认添加了 ...

  6. vue2双向绑定原理及源码解析

    首先我们要知道VUE实现双向绑定的步骤是什么: 实现一个监听器 Observer 对数据对象进行遍历,包括子属性对象的属性,利用 Object.defineProperty() 对属性都加上 sett ...

  7. Terraform 系列-Terraform 项目的典型文件布局

    系列文章 Terraform 系列文章 典型文件布局 - modules/ - services/ - webserver-cluster/ - examples/ - main.tf - outpu ...

  8. NEFU高级程序设计-期末复习习题组

    1. 用链表实现单词序列倒序输出 题目 用链表实现单词序列倒序输出.与以往不同,请考虑采用一种完全的动态分配方式! 为降低难度,"仁慈"的我已经给出了输出和释放的代码,你只要写出创 ...

  9. Onetable:统一的表格式元数据表示

    概括 Onehouse 客户现在可以将他们的 Hudi 表查询为 Apache Iceberg 和/或 Delta Lake 表,享受从云上查询引擎到顶级开源项目的原生性能优化. 在数据平台需求层次结 ...

  10. 3d基础 - 从模型坐标到屏幕坐标

    在 3D 引擎中,场景通常被描述为三维空间中的模型或对象,每个模型对象由许多三维顶点组成.最终,这些模型对象将在平面屏幕上呈现和显示. 渲染场景始终相对于摄像机,因此,还必须相对于摄像机的视图定义场景 ...