统计上升四元组

news2024/11/26 20:38:30

🌈个人主页: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];
else
	great[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]
else
	less[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.coloradmin.cn/o/2124548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

# CentOS7 设置mysql的 root 用户密码时,报错 ERROR 1819(HY000)...ERROR1193... 解决方法。

CentOS7 设置mysql的 root 用户密码时&#xff0c;报错 ERROR 1819(HY000)…ERROR1193… 解决方法。 一、错误描述&#xff1a; mysql ALTER USER rootlocalhost IDENTIFIED BY 123; ERROR 1819 (HY000) Your password does not satisfy the current policy requirementsERRO…

基于SC04B触摸芯片实现的触摸按键方案

基于SC04B触摸芯片实现的触摸按键方案 随着科技的不断进步&#xff0c;触摸按键技术已经广泛应用于各种电子设备中。SC04B作为一种常见的触摸感应芯片&#xff0c;以其高性能、低成本、高灵敏度和易于集成的特点&#xff0c;在触摸按键方案中备受青睐。 SC04B触摸芯片特点 SC…

数据结构--串的模式匹配算法

文章目录 串的模式匹配算法1.朴素算法&#xff08;Brute-Force(BF)暴力算法&#xff09;BF算法分析 2.KMP算法字符串的最长公共前后缀部分匹配表&#xff08;前缀表&#xff09;Next 串的模式匹配算法 查找子串&#xff08;模式串&#xff09;在主串中的位置的操作通常称为串的…

NET8 MAUIBlazor发布用于windows应用

1.打开 PowerShell 终端 , 命令行进入工程目录,以我的例子工程为例 DOS命令:cd 项目名 2.复制窗口里面的 Thumbprint 下的指纹码, 例如我这个是E18EF79CF31104139F16BD2089F4AB1898D381C2 3.配置项目生成设置, 双击项目名称或者直接编辑 ltyj.C2.Cilent.csproj 文件 添加下面…

C语言操作符详解(13)

文章目录 前言一、二进制和进制转换2进制转10进制10进制转2进制2进制转8进制2进制转16进制 二、原码、反码、补码三、移位操作符左移操作符右移操作符 四、位操作符&^~一道奇葩的面试题一道练习题再来一个练习题 五、逗号表达式六、结构成员访问操作符结构体结构的声明结构…

汇编调用C库函数—printf、scanf和Win32API

RadASM: ;右键 -> 生成依赖项 -> 生成自定义 -> masm .586 .model flat,stdcall option casemap:noneinclude msvcrt.inc include Kernel32.inc include User32.incincludelib msvcrt.lib includelib Kernel32.lib includelib User32.libscanf proto c :ptr,:vararg …

Java 的Swing 之JFrame快速入门

3、讲原件添加到当前窗口当中 //讲原件添加到当前窗口当中 this.add(btnlong); this.add(btnreset); this.add(usertext); this.add(passtext); this.add(username); this.add(password); this.setVisible(true); 4、对对应按钮设置动作监听 btnlong.addActionListene…

足球大小球及亚盘数据分析与机器学习实战详解:从数据清洗到模型优化

本文将深入探讨Java在数据分析和机器学习中的实际应用&#xff0c;涵盖数据预处理、模型训练和优化等方面的内容。通过详尽的代码示例&#xff0c;帮助读者掌握相关技术并应用于实际项目中。 数据分析、初盘数据、走地数据、分析管理系统、AI大模型预测系统、全自动化下单系统…

直播相关02-录制麦克风声音,QT 信号与槽,自定义信号和槽

一 信号与槽函数 #include "mainwindow.h" #include <QPushButton> #include <iostream> using namespace std;//我们的目的是在 window中加入一个button&#xff0c;当点击这个button后&#xff0c;关闭 MainWindow 。 MainWindow::MainWindow(QWidget …

【实施文档】软件项目实施方案(Doc原件2024实际项目)

软件实施方案 二、 项目介绍 三、 项目实施 四、 项目实施计划 五、 人员培训 六、 项目验收 七、 售后服务 八、 项目保障措施软件开发管理全套资料包清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&am…

【文献阅读】Unsupervised Machine Learning for Bot Detection on Twitter

Abstract 引入新特征&#xff0c;并降低所提模型的复杂性&#xff0c;从而提高基于聚类算法的机器人识别准确性。 最小化数据集维度和选择重要特征来实现的。 实验证明该方法的特征可以与四种不同的聚类技术&#xff08;agglomerating、k-medoids、DBSCAN 和 K-means&#x…

Android Graphics 显示系统 - VirtualDisplay mirrorDisplay 简单示例

“ Life is like a box of chocolates, you never konw what youre going to get。最近我也得到了一块巧克力&#xff0c;迫不及待地想尝一下甜的惊喜 。” 前言 上一篇文章&#xff0c;我们分享了一个VirtualDisplay的简单实例&#xff0c;主要是为了引入创建虚拟屏幕都使用了…

C# 如何检查两个给定的线段是否相交(How to check if two given line segments intersect)

给定两条线段(p1, q1)和(p2, q2)&#xff0c;判断给定的线段是否相交。 在讨论解决方案之前&#xff0c;让我们先定义方向的概念。平面中有序点三元组的方向可以是 –逆时针 –顺时针 –共线 下图显示了&#xff08;a&#xff0c;b&#xff0c;c&#xff09; 的不同可能方…

多进程批量下载era5再分析数据

1.配置key https://cds.climate.copernicus.eu/api-how-to 获取key 修改配置文件&#xff0c;把url和key复制进行 vim $HOME/.cdsapirc2.下载 根据要求修改年和月份等变量 import cdsapi import calendar import concurrent.futures import osdef download_month_data(year,…

KEIL编译生成.bin文件的简单方法

fromelf --bin -o "$LL.bin" "#L" 如图 如果不行请尝试其他方法

大模型算法入行转行?我建议你这样做!

最近私信问我关于入行、转行方面的问题比较多&#xff0c;就专门写一篇讲讲我的理解。 首先说明一下个人的背景和现状&#xff0c;我本人是本科学历&#xff0c;有互联网大厂搜推方向经验&#xff0c;后来跳到中厂继续做推荐&#xff0c;去年开始做大模型。现在是个小组长&…

c中 int 和 unsigned int

c语言中&#xff0c;char、short、int、int64以及unsigned char、unsigned short、unsigned int、unsigned int64等等类型都可以表示整数。但是他们表示整数的位数不同&#xff0c;比如&#xff1a;char/unisigned char表示8位整数&#xff1b; short/unsigned short表示16位整…

桂林自闭症寄宿学校:用关爱点亮未来

在桂林这座风景如画的城市中&#xff0c;隐藏着一所特别的学校&#xff0c;它以无尽的关爱与专业&#xff0c;为自闭症儿童撑起了一片希望的天空&#xff0c;这就是星贝育园自闭症儿童寄宿制学校。在这里&#xff0c;每一个孩子都是独一无二的&#xff0c;他们被温柔以待&#…

仪器计量校准的设备保养方法有哪些?

仪器校准、检定&#xff0c;是对设备和仪器进行校正和校验。与规范所再现的相应值相关联的一组检测&#xff0c;以规定精确测量仪器或检测系统所指示的值&#xff0c;及产品测量仪器和对照化学物质所隐含的值&#xff0c;是否符合所要求的标准。 仪器校准可能包括以下过程&…

postgresql|数据库|pg_repack和idle_in_transaction_session_timeout参数的关系

一、问题描述 在使用pg_repack这个工具做数据库的表膨胀清理过程中&#xff0c;经常会遇到类似这样的警告&#xff1a; 这里的警告表明在膨胀治理的时候&#xff0c;此表遇到了事务阻塞&#xff0c;而此时我们有三种选择&#xff0c;第一个选择是等待该事务结束&#xff0c;第…