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

embedded/2024/9/25 11:15:41/

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

http://www.ppmy.cn/embedded/111529.html

相关文章

【北京迅为】《STM32MP157开发板使用手册》- 第二十八章Cortex-M4外部中断实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

Linux shell编程学习笔记78:cpio命令——文件和目录归档工具(上)

0 前言 在Linux系统中&#xff0c;除了tar命令&#xff0c;我们还可以使用cpio命令来进行文件和目录的归档。 1 cpio命令的功能&#xff0c;帮助信息&#xff0c;格式&#xff0c;选项和参数说明 1.1 cpio命令的功能 cpio 名字来自 "copy in, copy out"&#xf…

鸿蒙轻内核M核源码分析系列十五 CPU使用率CPUP

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 轻内核M核源码分析系列一 数据结构-双向循环链表 轻内核M核源码分析系列二 数据结构-任务就绪队列 鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表 轻…

GraphRAG源码解读:基于知识图谱构建的检索增强生成系统

1. 引言 GraphRAG&#xff0c;微软开源的一个新的基于知识图谱构建的检索增强生成&#xff08;RAG&#xff09;系统&#xff0c;该框架旨在利用大型语言模型&#xff08;LLMs&#xff09;从非结构化文本中提取结构化数据, 构建具有标签的知识图谱&#xff0c;以支持数据集问题…

实战 Transformers 模型微调之数据集处理库 Hugging Face Datasets

在深度学习中&#xff0c;数据处理是模型训练的关键环节之一。Hugging Face Datasets 库提供了一套强大的工具来简化这一过程&#xff0c;使数据集的管理和预处理变得高效且直观。本文将详细介绍 Hugging Face Datasets 库的基本用法和数据预处理策略&#xff0c;并结合实际代码…

远程控制如何赋能制造业?可视化产线设备运维降本增效

随着如今制造业智能化程度的不断提升&#xff0c;传统制造业对于远程控制方案的需求也越来越紧迫。 在引入远程控制技术之前&#xff0c;无论是日常办公还是产线设备运维&#xff0c;都存在一定的运维资源浪费&#xff0c;效率低下等问题。 那么作为专业的远程控制解决方案品牌…

JS获取页面中video标签视频的封面和时长

从HTML中提取Video信息 /*** 从html字符串中提取video标签* 入参&#xff1a; {String} htmlString* 出参&#xff1a;{Array} 数组*/ function extractVideosFromHTML(htmlString) {const dom new DOMParser().parseFromString(htmlString, text/html);const videos Arr…

微信小程序 本地文件获取原始名称问题

微信版本&#xff1a;8.0.50 结论&#xff1a;图片&#xff0c;视频类文件&#xff0c;获取不到真实名称&#xff0c;文本类文件&#xff0c;压缩包&#xff0c;安装包&#xff0c;可以从chooseMessageFile中获取 具体细节理解&#xff1a;微信文件处理与命名机制分析&#xff…