当前位置: 首页 > 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)
}

相关文章:

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

2552. 统计上升四元组 today 2552. 统计上升四元组 题目描述 给你一个长度为n下标从 0 开始的整数数组 nums &#xff0c;它包含1到n的所有数字&#xff0c;请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足以下条件&#xff0c;我们称它是上升的&#xff1a;…...

Unity 编辑器设置中文

在 Unity 编辑器中&#xff0c;你可以按照以下步骤将语言设置为中文&#xff1a; 步骤&#xff1a; 1. 打开 Unity 编辑器。 2. 在顶部菜单栏&#xff0c;依次点击 Edit > Preferences&#xff08;在 macOS 上是 Unity > Preferences&#xff09;。 3. 在弹出的 Preferen…...

springboot-创建连接池

操作数据库 代码开发步骤&#xff1a; pom.xml文件配置依赖properties文件配置连接数据库信息&#xff08;连接池用的是HikariDataSource&#xff09;数据库连接池开发 configurationproperties和value注解从properties文件中取值bean方法开发 service层代码操作数据库 步骤&am…...

matlab绘制不同区域不同色彩的图,并显示数据(代码)

绘图结果如下&#xff1a; 代码如下&#xff1a; A为绘图的数据&#xff0c;每个数据对应着上图中的一个区域&#xff0c;数据大小决定区域的颜色 % 假设有一系列的数据点 Arand(5,6); %A为绘图的数据&#xff0c;数据大小决定颜色 wei_shu%.3f; %代表数据保留三位小…...

Docker Desktop 的安装与汉化指南

前言 Docker Desktop 是一款非常流行的开发工具&#xff0c;它使得开发者能够在自己的计算机上轻松地构建、运行和调试 Docker 容器。然而&#xff0c;默认情况下&#xff0c;Docker Desktop 的界面是英文的&#xff0c;对于中文用户来说&#xff0c;有时候会觉得不够友好。幸…...

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from vue; import App from ./App.vue; import { downloadTokenFile } from /path/to/your/function; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上 Vue.prototype.$downloadTokenFile downloadTokenFile;new Vue({el: #app,render:…...

Leetcode面试经典150题-141.环形链表

题目比较简单&#xff0c;重点是理解思想 解法都在代码里&#xff0c;不懂就留言或者私信 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public…...

sh文件执行提示语法错误: 未预期的文件结尾

在执行sh文件时总是提示&#xff1a;语法错误: 未预期的文件结尾&#xff0c;尝试删除最后的空格也不对 最后发现在notepad中转换的问题 需要把windows换成unix就行了...

基于SpringBoot的甜品店管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的蛋糕甜品店管理系…...

动态规划-不同的子序列

题目描述 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例&#xff1a; 输入&#xff1a;s "babgbag", t "bag" 输出&#xff1a;5 解释&#xff1a; 如下所示, 有 5 种可以从…...

如何通过OceanBase的多级弹性扩缩容能力应对业务洪峰

每周四晚上的10点&#xff0c;都有近百万的年轻用户进入泡泡玛特的抽盒机小程序&#xff0c;共同参与到抢抽盲盒新品的活动中。瞬间的并发流量激增对抽盒机小程序的系统构成了巨大的挑战&#xff0c;同时也对其数据库的扩容能力也提出了更高的要求。 但泡泡玛特的工程师们一点…...

D - 1D Country(AtCoder Beginner Contest 371)

题目链接: D - 1D Country (atcoder.jp) 题目描述: 数据范围: 输入输出: 题目分析: 典型的l, r 区间问题&#xff0c;即是前缀和问题&#xff0c;但是注意到数据范围, 数据范围1e-9 到 1e9 数据范围&#xff0c;要是从最小到最大直接for循环去模拟的话&#xff0c;时间复杂度…...

怎么很多张图片拼接成一张?试试这几种图片拼接方法!

怎么很多张图片拼接成一张&#xff1f;在繁忙的现代生活中&#xff0c;我们不断地捕捉和累积着各式各样的图像&#xff0c;它们如同记忆的珍珠&#xff0c;串联起生活的每一个瞬间&#xff0c;然而&#xff0c;随图片数量的激增&#xff0c;管理它们成为了一项挑战&#xff0c;…...

Python实现优化的分水岭算法

目录 优化分水岭算法的博客1. 分水岭算法优化概述2. 优化分水岭算法的步骤3. Python实现优化后的分水岭算法4. 实例&#xff1a;优化分水岭算法在图像分割中的应用5. 总结 优化分水岭算法的博客 分水岭算法是一种强大的图像分割方法&#xff0c;特别适用于分离不同的对象和区域…...

智慧交通基于yolov8的行人车辆检测计数系统python源码+onnx模型+精美GUI界面

【算法介绍】 智慧交通中&#xff0c;基于YOLOv8的行人车辆检测计数系统是一项高效、准确的技术解决方案。该系统利用YOLOv8这一先进的目标检测算法&#xff0c;结合深度学习技术&#xff0c;能够实时检测并准确计数道路上的行人和车辆。YOLOv8在保证检测速度的同时&#xff0…...

Linux开发工具的使用

文章目录 vim的使用基本模式介绍光标当前行操作&#xff08;命令行模式&#xff09;光标快速定位&#xff08;命令行模式&#xff09;&#xff1a;插入模式的三种方式&#xff08;命令行模式&#xff09;&#xff1a;vim基本操作&#xff08;命令行模式&#xff09;底行模式的操…...

【devops】devops-git之介绍以及日常使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

012复杂度07leetcode

视频地址:012复杂度07leetcode_哔哩哔哩_bilibili 网站叫做leetcode。那Linux我相信很多同学都听过这个网站&#xff0c;那这个网站干嘛用呢&#xff1f;这个网站是用于练习算法的一个好网站&#xff0c;那我们这个课程在讲解知识点过程中也会不断的去用到这个网站&#xff0c…...

4.网络编程

1、目的 传播交流信息TCP&#xff1a;打电话UDP&#xff1a;发短信 2、通信协议&#xff1a; httpTCP/IP簇&#xff1a;三次握手&#xff08;aba&#xff09;&#xff0c;四次挥手(abba)https 3、IP与端口 1.IP地址类&#xff1a;InetAddress、InetSocketAddress InetAdd…...

OpenCV GUI常用函数详解

在OpenCV的High_level GUI模组中有很多GUI函数&#xff0c;下面介绍几个常用的函数。 图像显示窗口相关函数 生成图像显示窗口函数nameWindow() nameWindow()函数的原型如下&#xff1a; 函数用以创建一个给定名的图像显示窗口&#xff08;后面简单叫做图像窗口&#xff09;…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...