首页 > 其他分享 >2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums。 它包含 1 到 n 的所有数字,请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足

2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums。 它包含 1 到 n 的所有数字,请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足

时间:2023-11-22 21:58:28浏览次数:41  
标签:11 cnt 22 nums ++ 四元组 int ans dp

2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums。

它包含 1 到 n 的所有数字,请你返回上升四元组的数目。

如果一个四元组 (i, j, k, l) 满足以下条件,我们称它是上升的:

0 <= i < j < k < l < n 且

nums[i] < nums[k] < nums[j] < nums[l] 。

输入:nums = [1,3,2,4,5]。

输出:2。

来自左程云

答案2023-11-22:

go代码用灵捷3.5编写。

rust代码用讯飞星火编写。

c++的代码用天工编写。

灵捷3.5本来用起来还可以,但有次数限制,故放弃。

大体过程如下:

算法1:countQuadruplets1

1.初始化变量:n为数组长度,ans为结果计数器,dp为动态规划数组。

2.遍历数组,从第二个元素开始(下标为1):

a.初始化计数器cnt为0。

b.遍历当前元素之前的所有元素(下标小于当前元素的下标),如果当前元素大于前一个元素,则将dp[j]加到ans上,并将cnt加1。

c.再次遍历当前元素之前的所有元素(下标小于当前元素的下标),如果当前元素大于前一个元素,则将cnt加到dp[j]上;否则,将dp[j]加上cnt的整数值。

3.返回ans作为结果。

算法2:countQuadruplets2

1.初始化变量:n为数组长度,ans为结果计数器,dp为动态规划数组。

2.遍历数组,从第二个元素开始(下标为1):

a.初始化计数器cnt为0。

b.遍历当前元素之前的所有元素(下标小于当前元素的下标),如果当前元素大于前一个元素,则将dp[j]加到ans上,并将cnt加1;否则,将dp[j]加上cnt的整数值。

3.返回ans作为结果。

总的时间复杂度:两种算法的时间复杂度都是O(n^2),因为需要两层循环遍历数组。

总的额外空间复杂度:两种算法的空间复杂度都是O(n),因为需要使用一个长度为n的动态规划数组dp。

go完整代码如下:

package main

import "fmt"

func countQuadruplets1(nums []int) int64 {
	n := len(nums)
	var ans int64
	dp := make([]int64, n)
	for l := 1; l < n; l++ {
		cnt := 0
		for j := 0; j < l; j++ {
			if nums[j] < nums[l] {
				ans += dp[j]
			}
		}

		cnt = 0
		for j := 0; j < l; j++ {
			if nums[j] < nums[l] {
				cnt++
			} else {
				dp[j] += int64(cnt)
			}
		}
	}
	return ans
}

func countQuadruplets2(nums []int) int64 {
	n := len(nums)
	var ans int64
	dp := make([]int64, n)
	for l := 1; l < n; l++ {
		cnt := 0
		for j := 0; j < l; j++ {
			if nums[j] < nums[l] {
				ans += dp[j]
				cnt++
			} else {
				dp[j] += int64(cnt)
			}
		}
	}
	return ans
}

func main() {
	nums := []int{1, 3, 2, 4, 5}
	fmt.Println(countQuadruplets1(nums))
	fmt.Println(countQuadruplets2(nums))
}

在这里插入图片描述

rust完整代码如下:

fn count_quadruplets1(nums: Vec<i32>) -> i64 {
    let n = nums.len();
    let mut ans = 0;
    let mut dp = vec![0; n];
    for l in 1..n {
        let mut cnt = 0;
        for j in 0..l {
            if nums[j] < nums[l] {
                ans += dp[j];
                cnt += 1;
            } else {
                dp[j] += cnt;
            }
        }
    }
    ans as i64
}

fn count_quadruplets2(nums: Vec<i32>) -> i64 {
    let n = nums.len();
    let mut ans = 0;
    let mut dp = vec![0; n];
    for l in 1..n {
        let mut cnt = 0;
        for j in 0..l {
            if nums[j] < nums[l] {
                ans += dp[j];
                cnt += 1;
            } else {
                dp[j] += cnt;
            }
        }
    }
    ans as i64
}

fn main() {
    let nums = vec![1, 3, 2, 4, 5];
    println!("count_quadruplets1: {}", count_quadruplets1(nums));
    let nums = vec![1, 3, 2, 4, 5];
    println!("count_quadruplets2: {}", count_quadruplets2(nums));
}

在这里插入图片描述

c++完整代码如下:

#include <iostream>
#include <vector>
using namespace std;

long long countQuadruplets1(vector<int>& nums) {
    int n = nums.size();
    long long ans = 0;
    vector<long long> dp(n, 0);
    for (int l = 1; l < n; l++) {
        for (int j = 0; j < l; j++) {
            if (nums[j] < nums[l]) {
                ans += dp[j];
            }
        }
        int cnt = 0;
        for (int j = 0; j < l; j++) {
            if (nums[j] < nums[l]) {
                cnt++;
            }
            else {
                dp[j] += cnt;
                break;
            }
        }
    }
    return ans;
}

long long countQuadruplets2(vector<int>& nums) {
    int n = nums.size();
    long long ans = 0;
    vector<long long> dp(n, 0);
    for (int l = 1; l < n; l++) {
        int cnt = 0;
        for (int j = 0; j < l; j++) {
            if (nums[j] < nums[l]) {
                ans += dp[j];
                cnt++;
            }
            else {
                dp[j] += cnt;
            }
        }
    }
    return ans;
}

int main() {
    vector<int> nums = { 1, 3, 2, 4, 5 };
    cout << countQuadruplets1(nums) << endl;
    cout << countQuadruplets2(nums) << endl;
    return 0;
}

在这里插入图片描述

标签:11,cnt,22,nums,++,四元组,int,ans,dp
From: https://www.cnblogs.com/moonfdd/p/17850389.html

相关文章

  • 20231121 rock5b 接入mpu6050模块 驱动成功!感谢https://github.com/LitchiCheng/mpu60
    我的rock5b安装的其radxa官方OS,里面有一个rsetup程序的overlay功能可以管理设备树,我想根据https://github.com/LitchiCheng/mpu6050-linux来尝试连接一个6050;先rsetup里面的overlay管理开启i2c8-m4设备节点,之后在/boot/dtco i2c8-m4设备节点已经启用现在......
  • 2023.11.22值得推荐的一款服务器空间
    ,已经体验一个月咯,非常不错的免费资源,适合大家去了解了解~!他们家的免费空间,免费服务器,非常稳定,非常靠谱,值得拥有,价格厚道~!免备案服务,域名管理等等服务,应有尽有,2023年你值得了解,他们家的免费云服务器还是独立IP的哦,非常非常好,非常NICE~!官网地址:https://www.sanfengyun.com......
  • 11.22
    好几天没写了,来颓一会。所以只有我不会用VScode的世界达成了?我看了几十篇,都是园子和CSDN的,要么让我翻过白名单下载千奇百怪的插件,包括但不限于g++、gtp、汉化包、MinGW-W64,要么在控制栏输入长度20多的字符串,还有的给我整个tasks.json,到最后也没告诉我怎么直接编译c++代码。最恶......
  • 11.22
    今天晚上就是水题。今天好像一开始来的时候有很多想说的,但是全给忘了。以后我会把灵感记在本上。没啥好说的。以后其实不打算写什么闲话了,比较每天学习甚微,而且也没啥有趣的事发生,而且好多学长都退役了,写给谁看?悲......
  • 2023.11.22 日记g
    今天又来机房了。本来最近没啥训练的心情的,奈不过sx热情万分。噢噢,下午和同学打球去了又没有洗澡,吃完饭回教室已经有点晚迟到了,然后lsx提议直接来机房,我曰:“善!”然后改了上一场arc的b、c、d。感觉大脑出现了一些问题。不过最终还是完成了任务。然后今天whk还是一如既往......
  • 2023.11.22——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.JavaGUI2.会话跟踪技术明日计划:学习......
  • 每日总结20231122
    代码时间(包括上课)5h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周三,上午上的是软件构造,软件构造讲的是应用数据库和基于复用的软件规则。2、今天下午写了团队的erp,目前还没有完成,得加班了。3、今天晚上打算写写团队的ERP系统和软件构造的四则运算的GUI版本并且将生成的题......
  • 每日总结11.22
    软件复用的优点有:(1)提高生产率(2)减少维护代价(3)提高互操作性(4)支持快速原型依据复用的对象,软件复用分为(产品复用)和(过程复用)。最常用的可复用设计是(设计模式)和(架构模式)。(构件)通常是代码复用,而(设计模式)是设计复用,(框架)则介于两者之间框架方法包括:(构件技术)、(软件体系结构)和(......
  • Spring_2023_11_22_3 Spring--连接数据库
    Spring--连接数据库Spring提供了JdbcTemplate模板类依赖的引入:i. Spring-contextii. Spring-jdbciii. Mysqliv. dbcp(连接池)<!--spring基础依赖--><dependency><groupId>org.springframework</groupId><artifactId......
  • 2023-11-22 Invariant Violation: [app.model] namespace should be unique ==》模块
     如上图,报错原因:存在多个名为demoDataSource的模块名称导致报错解决方案:修改模块名称即可,把demoDataSource改为demoDataSource2就不会报错了扩展:该问题是由rudex引起的,redex要求数据模型(models)命名(namespace)必须不同,否则在注入该数据模型时就会报错......