当前位置: 首页 > news >正文

LeetCode: 2552. 统计上升四元组 动态规划 时间复杂度O(n*n)

2552. 统计上升四元组

today 2552. 统计上升四元组

题目描述

给你一个长度为n下标从 0 开始的整数数组 nums ,它包含1n的所有数字,请你返回上升四元组的数目。

如果一个四元组 (i, j, k, l) 满足以下条件,我们称它是上升的:

  • 0 <= i < j < k < l < n
  • nums[i] < nums[k] < nums[j] < nums[l]

示例 1:

输入:nums = [1,3,2,4,5]
输出:2
解释:
- 当 i = 0 ,j = 1 ,k = 2 且 l = 3 时,有 nums[i] < nums[k] < nums[j] < nums[l] 。
- 当 i = 0 ,j = 1 ,k = 2 且 l = 4 时,有 nums[i] < nums[k] < nums[j] < nums[l] 。
没有其他的四元组,所以我们返回 2 。

示例 2:

输入:nums = [1,2,3,4]
输出:0
解释:没有四元组,所以我们返回 0 。

提示:

  • 4 <= nums.length <= 4000
  • 1 <= nums[i] <= nums.length
  • nums 中所有数字 互不相同 ,nums 是一个排列。

解题思路

我们可以枚举四元组中的 jk,那么问题转化为,对于当前的 j k

统计有多少个 l 满足 l>knums[l]>nums[j],记为cnt1
统计有多少个 i 满足 i<jnums[i]<nums[k],记为cnt2;

所以,对于每一组 jk,满足条件的组合数目为cnt1*cnt2,将所有jk组合数目相加,就是答案。

那么我们可以用动态规划解决这个问题。

使用二维数组 f 来记录 jk 组合的情况,f[j][k] 表示 有多少个l满足满足 l>knums[l]>nums[j]

初始化 f[j][n-1]0,表示对于末尾元素为k的情况下,没有满足条件的l。注意1<=j<n-2

从后往前填充行f[j],如果nums[k]>nums[j],则f[j][k-1]=f[j][k]+1

此时,对于每个jk,我们都可以计算出有多少个 l 满足 l>knums[l]>nums[j],即cnt1=f[j][k]

对于每个jk,我们已经通过二维数组 f,记录了cnt1的取值,接下来,我们只需要记录cnt2的取值即可。

对于每个jk,我们可以确定k,,之后从前往后遍历数组。
初始化cnt2=0,如果

  • nums[j]<nums[k],则cnt2+=1,表示当前有多少个i满足nums[i]<nums[k]
  • nums[j]>nums[k],则当前jk满足条件,我们将cnt2*cnt1cnt2*f[j][k]加入答案。

最后,返回答案即可。

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2),其中 n n n 是数组的长度。
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2),其中 n n n 是数组的长度。

代码实现

Python实现:

class Solution(object):def countQuadruplets(self, nums):n=len(nums)f=[[0]*n for i in range(n)]ans=0for j in range(1,n-2):cnt=0for k in range(n-1,j,-1):f[j][k]=cntif nums[k]>nums[j]:cnt+=1for k in range(2,n-1):cnt=0for j in range(0,k):if(nums[j]>nums[k]):ans+=cnt*f[j][k]else:cnt+=1return ans

C++实现:

class Solution {
public:long long countQuadruplets(vector<int>& nums) {int n=nums.size();vector<vector<int>> f(n,vector<int>(n,0));long long res=0;for(int j=1;j<n-2;j++){int cnt=0;for(int k=n-1;k>j;k--){f[j][k]=cnt;if(nums[k]>nums[j]){cnt++;}}}for(int k=2;k<n-1;k++){int cnt=0;for(int j=0;j<k;j++){if(nums[j]<nums[k]){cnt++;continue;}else{res+=cnt*f[j][k];}}}return res;}
};

Go实现:

func countQuadruplets(nums []int) int64 {n := len(nums)f := make([][]int, n)for i := range f {f[i] = make([]int, n)}for j := 1; j < n-2; j++ {cnt := 0for k := n-1; k >j; k-- {f[j][k] = cntif nums[j] < nums[k] {cnt++} }}ans := 0for k := 2; k < n-1; k++ {cnt := 0for j := 0; j <k; j++ {if nums[j] < nums[k] {cnt++continue}else{ans+=cnt*f[j][k]}}}return int64(ans)
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OPENAIGC开发者大赛企业组金奖 | 句子互动,RPA+AI,打造大模型驱动的领先数字员工
  • 请解释Java中的深拷贝和浅拷贝的区别。什么是Java中的代理模式?它有什么作用?
  • 用Python实现阿拉伯数字转换成中国汉字
  • 怎样将vue项目 部署在ngixn的子目录下
  • C++——list常见函数的使用和模拟实现(2)
  • Spring Boot实现大文件分片下载
  • 内网渗透—横向移动非约束委派约束委派
  • 深度学习每周学习总结N9:transformer复现
  • 基于OMS构建OceanBase容灾双活架构的实践
  • 深入理解Elasticsearch的`_source`字段与索引优化
  • [C#学习笔记]LINQ
  • 企业微信运营工具:赋能企业数字化转型的利器
  • Playwright 和 Selenium的对比
  • 7.认识进程
  • 积分第二中值定理的证明
  • 【Leetcode】101. 对称二叉树
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 《Java编程思想》读书笔记-对象导论
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Docker 笔记(2):Dockerfile
  • Docker入门(二) - Dockerfile
  • Git的一些常用操作
  • js如何打印object对象
  • Node项目之评分系统(二)- 数据库设计
  • Python爬虫--- 1.3 BS4库的解析器
  • React中的“虫洞”——Context
  • Redash本地开发环境搭建
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Xmanager 远程桌面 CentOS 7
  • 大型网站性能监测、分析与优化常见问题QA
  • 浮动相关
  • 如何在 Tornado 中实现 Middleware
  • 算法-图和图算法
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 由插件封装引出的一丢丢思考
  • 正则表达式
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 函数计算新功能-----支持C#函数
  • ​如何防止网络攻击?
  • ​一些不规范的GTID使用场景
  • # 数据结构
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #nginx配置案例
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (1)Jupyter Notebook 下载及安装
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二)windows配置JDK环境
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • .form文件_SSM框架文件上传篇