【c++实现】统计上升四元组

🌈个人主页:Yui_
🌈Linux专栏:Linux
🌈C语言笔记专栏:C语言笔记
🌈数据结构专栏:数据结构
🌈C++专栏:C++

文章目录

  • 1. 题目描述
  • 2. 解释
  • 3. DP前缀和+枚举

1. 题目描述

给你一个长度为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
解释:

  1. 当i = 0,j = 1。k = 2 且 l = 3时,有nums[i] < nums[k] < nums[j] < nums[l]。
  2. 当 i = 0,j = 1,k = 2 且 l = 4时,有nums[i] < nums[k] < nums[j] < nums[l]。
    示例2
    输入:nums = [1,2,3,4]
    输出:0
    解释:只存在一个四元组 i = 0,j = 1,k = 2,l = 3但不满足nums[j]<nums[k],所以返回0。

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

2. 解释

首先写4个数,就1324这就是一个满足条件的四元组。nums[i]<nums[k]<nums[j]<nums[l]
例子

这是一个满足条件的四元组,透过这个例子我们可以看出来什么呢?
现在有两个选择:固定j和k或者固定i和l
首先先选择固定i和l,当我们固定了i和l就代表了,j和k就要在i和l中间寻找,寻找大于nums[i]且小于nums[l]的j和k,这其实也不是很难用前缀和找就可以,但是找到了又不能直接用,因为还有满足nums[k]<nums[j]这个条件,如果我们选择固定j和k就不一样了。

选择固定j和k,选取的i和k肯定都是满足条件的i和k,当这一条件满足时,直接找i和l就方便多了。我们只需要找到小于nums[k]且在j位置前的数据个数,和找到大于nums[j]且在k位置后的数据个数。

于是可以把great[k][x]表示为:在k右侧比 x = nums[j]大的元素个数。
把less[j][x]表示为:在j左侧比x = nums[k]小的元素个数。
那么解决方法就出来了,枚举j和k,把满足大小关系的i的个数和l的个数。

less[j][nums[k]]*great[k][nums[j]].

3. DP前缀和+枚举

考虑动态规划:

  • 如果x>=nums[k+1],那么[k右边的比x大的数]就会等于[k+1右边的比x大的数],也就是great[k][x] = great[k+1][x]。
    8 4 6 5 7 9 3 2 1为例,当前的4元组为4 6 5 7
    因为x大于nums[k+1] = 7,那么对于大于k右边的比x大的数,k+1的位置就是无关变量。
    例子

  • 如果x<nums[k+1],那么额外加1,也就是great[k][x] = great[k+1][x]+1。
    这个也很好理解,x比nums[k+1]小,nums[k+1]也占一个大于x的位置,那great[k][x]就会在加1咯。
    也就可以整理得到:

if(x>=nums[k+1])great[k][x] = great[k+1][x];
elsegreat[k][x] = great[k+1][x]+1;

因为在求great[k][x]前需要知道great[k+1][x]的信息,也就确定的我们需要倒序遍历数组。
因为还有数组数据是1~n的,在处理x的问题上,直接在循环里嵌套一个x从n到1的循环就可以了。当然这个肯定是可以优化的。
对于less的计算是同理的:

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

后续可能会优化代码吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/422276.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙交互事件开发04——手势事件

1 概 述 手势事件是移动应用开发中最常见的事件之一&#xff0c;鸿蒙提供了一些方法来绑定手势事件。通过给各个组件绑定不同的手势事件&#xff0c;并设计事件的响应方式&#xff0c;当手势识别成功时&#xff0c;ArkUI框架将通过事件回调通知组件手势识别的结果。 …

ARM32开发——DMA内存到内存

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求数据交互流程开发流程依赖引入DMA初始DMA传输请求完整代码 关心的内容DMA初始化DMA初始化DMA数据传输请求完整代码 DMA中断开启…

Ruoyi Cloud 本地启动

参考 http://doc.ruoyi.vip/ https://gitee.com/y_project/RuoYi-Cloud https://blog.csdn.net/cs_dnzk/article/details/135289966 https://doc.ruoyi.vip/ruoyi-cloud/cloud/seata.html#%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D 拉取代码本地跑通 用 git 从 ruoyi 微服务版仓…

sqli-labs靶场自动化利用工具——第6关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

已成功入职华为,总结精选50个大模型高频面试题(附答案)

觉得中大厂面试太难的&#xff0c;完全就是自己没准备充分&#xff0c;技术不到位&#xff0c;没准备的面试完全是浪费时间&#xff0c;更是对自己的不负责! . 今天我给大家分享一下我整理的**《精选50个大模型高频面试题》** 大模型面试专题和答案&#xff0c;其中大部分都是面…

做统计(蓝桥杯初级)

系列文章目录 e&#xff0c;新系列没有目录&#xff09; 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入输入样例&#xff1a; 2.输出输出样例&#xff1a; 3.代码示例 四、思路总结 前言 今天我们来做《做统计》 一、个人名片 个人主页&…

GPT-4论文阅读

GPT-4 Technical Report论文阅读 文章目录 GPT-4 Technical Report论文阅读 Abstract训练的稳定性Training processPredictable scaling训练的稳定性多么难能可贵 Capabilities考试成绩传统的benchmark语言方面的能力Visual inputsSteerability LimitationsRisks & mitigat…

架构模式:MVC

引言 MVC&#xff0c;即 Model&#xff08;模型&#xff09;-View&#xff08;视图&#xff09;-Controller&#xff08;控制器&#xff09;&#xff0c;是广泛应用于交互式系统中的典型架构模式&#xff0c;尤其在 GUI 和 Web 应用中。 MVC 的概念源自 GOF&#xff08;Gang …

Java设计模式之命令模式介绍和案例示范

一、命令模式简介 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户端进行参数化、对请求排队或记录日志&#xff0c;以及支持可撤销的操作。命令模式的核心思想是将发出请…

学习Vue3的第四天

目录 pinia 安装 Pinia 存储读取数据 修改数据(三种方式) storeToRefs getters $subscribe store组合式写法 组件通信 props 自定义事件 mitt v-model $attrs $refs、$parent provide、inject slot pinia Pinia 是一个用于 Vue.js 的状态管理库&#xff0c;作…

vue-i18n 使用 $t 导致的 Typescript 报错问题

目录 1&#xff0c;问题2&#xff0c;解决 1&#xff0c;问题 在 Vue3 项目中使用 vue-i18n v9.14.0 时&#xff0c;可以&#xff1a; <template><div>{{ t(xxx) }}</div> </template><script setup lang"ts"> import { useI18n } f…

顶踩Emlog插件源码

源码介绍 顶踩Emlog插件源码 前些天看到小刀娱乐网的文章页面有了一些变化&#xff0c;那就是增加了一个有价值/无价值的顶踩按钮。 样式也是非常的好看 再加上两个表情包是非常的有趣。 写到了Emlog系统&#xff0c;效果如上图。 如何使用&#xff1a; 需要在echo_log.…

Datasheet SHT20芯片的数据手册

Datasheet SHT20芯片的数据手册 I2C读取湿度传感器返回的16位数据。SCL SDA 14位有效&#xff0c;我以为是将后二位删除&#xff0c;实际上看完手册才知道是后二位值无用&#xff0c;不是删除&#xff0c;而是清0&#xff0c;实际上还是16为&#xff0c;知识后二位是0还是1&…

Flume 日志采集系统

Flume 日志采集系统 一、Flume 概述二、Flume 架构设计2.1 架构图2.2 Flume Source 类型2.3 Flume Channel 类型2.4 Flume Sink 类型 三、Flume 安装部署3.1 下载解压3.2 上传解压3.3 修改配置文件2.4 启动 Flume Agent 四、案例实践&#xff1a;Flume 分布式集群搭建4.1 Flume…

基于SpringBoot的准妈妈孕期交流平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;IDEA/Eclipse、Navicat 系统展示 首页 管理员登录 用户管理 早教…

利用CubeMX复现正点原子TFTLCD驱动例程

来源&#xff1a;正点原子 FMC的工作原理暂时先欠着&#xff0c;先记录一下CRUD的过程。 第一步准备一个us级别延时函数&#xff0c;不会的参考拙作&#xff1a;STM32的定时器简介-CSDN博客 第二部开启FMC外设&#xff1a; ①进入 Pinout->FMC 配置栏&#xff0c;配置 …

如何做好网络安全

随着互联网技术的飞速发展&#xff0c;网站已成为企业对外展示、交流和服务的重要窗口。然而&#xff0c;随之而来的网站安全问题也日益凸显&#xff0c;给企业的业务发展和用户数据安全带来了巨大威胁。因此&#xff0c;高度重视网站安全已成为网络安全的首要任务。今天我们就…

使用ffmpeg在视频中绘制矩形区域

由于项目需要对视频中的人脸做定位跟踪&#xff0c; 我先使用了人脸识别算法&#xff0c;对视频中的每个帧识别人脸、通过人脸库比对&#xff0c;最终记录坐标等信息。 然后使用ffmpeg中的 drawbox 滤镜功能&#xff0c;选择性的绘制区域。从而实现人脸定位跟踪 1、drawbox …

用于协作代码开发的 10 大 GitHub 集成

GitHub 是开发人员的天堂。开发人员在分布式 GitHub 存储库中存储和管理其源代码,允许多个贡献者同时处理项目。这种协作行动将生产力提高了 22%,将修复漏洞的速度提高了 7 倍,并将入职时间缩短了 80%。 作为一个版本控制系统,它允许开发人员跟踪和审查更改、管理分支和合…

【Sceneform-EQR】通过sceneform-eqr实现一个视频播放器(使用安卓MediaPlayer实现视频播放)

在前一篇文档中介绍了如何在AR\三维场景创建几种背景 【Sceneform-EQR】scenefrom-eqr中的几种背景实现(不仅用于AR、三维场景&#xff0c;在图片、视频播放器中也适用) 本文将侧重介绍如何使用安卓MediaPlayer实现视频播放。 ↓↓↓↓↓↓↓↓↓↓↓↓ 以下正文 ↓↓↓↓↓↓…