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

news/2024/9/18 13:56:40/ 标签: 算法, 数据结构, 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.ppmy.cn/news/1525188.html

相关文章

使用 nvm 管理 node 版本:如何在 macOS 和 Windows 上安装使用nvm

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、nvm的安装与基本使用2.1 macOS安装nvm2.1.1 使用 curl 安装2.1.2 使用 Homebrew 安装 2.2 Windows安装nvm2.2.1 下载 nvm-windows2.2.2 安装 nvm-windows 2.3 安装node2.4 切换node版本 三、常见问题及解决方案…

graphQL 参数使用报错问题

query{getMembers(sid:0,nodeId:"ns6;i7896"){methods} } //报错 "message": "Field \"methods\" of type \"[UaMethod]\" must have a selection of subfields. Did you mean \"methods { ... }\"?",这个错误信…

观众登记2025中国(深圳)国际智能手机供应链展览会

时间&#xff1a;2024年4月9-11日 地点&#xff1a;深圳会展中心 ◆展会背景background&#xff1a; 近年来&#xff0c;国内手机品牌在全球市场上的影响力不断增强&#xff0c;华为、OPPO、VIVO和小米等…

实战案例(2)防火墙+二交换机VLAN组网

案例二&#xff1a;防火墙充当三层交换机与路由器角色功能进行组网 拿到这样的拓扑后&#xff0c;首先要了解好客户的需求&#xff0c;然后根据需求进行划分 比如客户那边有监控跟办公网络&#xff0c;可以通过VLAN划分不同的区域&#xff0c;然后二层交换机对接终端的口划入到…

Spring Boot属性注入的多种方式!

Spring Boot的一个问题&#xff0c;证明你是不是真正的 "会用" Spring boot ?Spring Boot的一个问题&#xff0c;直接暴露你是不是真正使用Spring Boothttps://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247484040&idx1&sn64ad15d95e44c874cc890973…

国产服务器CPU发展分析

CPU行业概览&#xff1a;信创带动服务器CPU国产化 目前CPU行业由两大生态体系主导&#xff1a;一是基于X86指令系统和Windows操作系统的Wintel体系&#xff0c;主要用于服务器与电脑等&#xff1b;二是基于ARM指令系统和Android操作系统的AA体系&#xff0c;主要用于移动设备…

机器学习和深度学习存在显著区别

机器学习和深度学习在多个方面存在显著的区别&#xff0c;以下是对这些区别的详细阐述&#xff1a; 定义与起源 机器学习&#xff1a;是人工智能的一个分支领域&#xff0c;它使计算机能够从数据中学习并改进其性能&#xff0c;而无需进行显式编程。机器学习起源于20世纪50年代…

认识原码反码补码

目录 一.何为原码反码和补码? (1)原码 (2)反码 (3)补码 (4)总结 二.原反补之间的简单计算 (1)补码加法 (2) 补码减法 (3) 溢出问题 一.何为原码反码和补码? (1)原码 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 符号位&#xff1a;最高位&#xf…

uniapp数据缓存和发起网络请求

数据缓存 uni.onStorageSync同步的方式将数据存储到本地缓存 <template><button click"onStorageSync()">存储数据</button> </template><script setup>const onStorageSync () > {// 存储数据uni.setStorageSync(username, 张三)…

Python——爬虫(2)

要使用Python爬取B站热门视频&#xff0c;可以使用第三方库requests和BeautifulSoup来实现。 首先&#xff0c;你需要安装这两个库。你可以使用以下命令在终端或命令提示符中安装它们&#xff1a; pip install requests beautifulsoup4接下来&#xff0c;你可以使用以下代码来…

使用Astra DB和LangChain构建高效的RAG系统:从入门到实践

使用Astra DB和LangChain构建高效的RAG系统&#xff1a;从入门到实践 1. 引言 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种结合了信息检索和文本生成的AI技术&#xff0c;能够显著提升大语言模型的表现。本文将介绍如何使…

React Native 0.76版本发布

关于 React Native 的 New Architecture 概念&#xff0c;最早应该是从 2018 年 RN 团队决定重写大量底层实现开始&#xff0c;因为那时候 React Native 面临各种结构问题和性能瓶颈&#xff0c;最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始&#xff0c;New A…

buildroot移植qt报错Info: creating stash file (补充qt添加字库)

移植qt库&#xff0c;编译文件报错Info: creating stash file /home/rbing/QT/uart/.qmake.stash Project ERROR: Unknown module(s) in QT: serialport rbingouc:~/QT/uart$ /home/rbing/linux/tool/buildroot-2022.02.9/output/host/usr/bin/qmake Info: creating stash fil…

ssm“健康早知道”微信小程序 LW PPT源码调试讲解

第二章开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个“健康早知道”微信小程序。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2…

梧桐数据库(WuTongDB):数据库技术中都有哪些常见的优化器

以下是一些常见的数据库优化器&#xff1a; 1. CBO&#xff08;Cost-Based Optimizer&#xff09; 应用场景&#xff1a;广泛应用于关系型数据库中&#xff0c;如Oracle、PostgreSQL、MySQL等。工作原理&#xff1a;通过计算不同执行计划的代价&#xff08;如CPU、I/O等资源消…

RabbitMQ延迟消息——DelayExchange插件

什么是死信以及死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff1a; 1. 消费者使用basic.reject或 basic.nack声明消费失败&#xff0c;并且消息的requeue参数设置为false 2. 消息是一个过期消息&#xff0c;超时无人消费 3. 要投递的队列消…

美国洛杉矶ip有哪些独特优势

美国洛杉矶的IP地址独特优势主要体现在以下几个方面&#xff0c;rak小编为您整理发布美国洛杉矶的IP地址独特优势&#xff0c;希望 对您选择服务器有帮助。 1. 丰富的IP资源&#xff1a;美国洛杉矶多IP服务器提供的IP数量从几十到几百不等&#xff0c;最多可提供多达511个独立I…

使用Django 搭建自动化平台

由于本人python 环境已安装&#xff0c;就不重复安装了&#xff0c;博客中有python的安装说明&#xff1b; 1 Django 的安装 安装很简单&#xff1a; pip install django 但是国内的网络环境&#xff0c;你很难成功&#xff0c;此处省略一些字。。。。。 问题总要解决&#…

QT QObject源码学习(二)

一、全局函数 1、qt_qFindChildren_helper函数 在给定的父对象下&#xff0c;查找所有匹配指定条件的子对象&#xff0c;并将它们添加到一个列表中。 &#xff08;1&#xff09;声明 /*** brief 在给定的父对象下&#xff0c;查找所有匹配指定条件的子对象&#xff0c;并将它…

Leetcode3275. 第 K 近障碍物查询

Every day a Leetcode 题目来源&#xff1a;3275. 第 K 近障碍物查询 解法1&#xff1a;大根堆 维护前 k 小元素&#xff0c;可以用最大堆。 遍历数组 queries&#xff0c;计算点 (x,y) 到原点的曼哈顿距离 d∣x∣∣y∣。 把 d 入堆&#xff0c;如果堆大小超过 k&#xff…