首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums。 它包含 1 到 n 的所有数字,请

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

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

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

0

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 

cnt := 0

for j := 0; j 

if nums[j] 

ans += dp[j]

}

}

cnt = 0

for j := 0; j 

if nums[j] 

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 

cnt := 0

for j := 0; j 

if nums[j] 

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) -> 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] 

ans += dp[j];

cnt += 1;

} else {

dp[j] += cnt;

}

}

}

ans as i64

}

fn count_quadruplets2(nums: Vec) -> 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] 

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 

#include 

using namespace std;

long long countQuadruplets1(vector& nums) {

int n = nums.size();

long long ans = 0;

vector dp(n, 0);

for (int l = 1; l 

for (int j = 0; j 

if (nums[j] 

ans += dp[j];

}

}

int cnt = 0;

for (int j = 0; j 

if (nums[j] 

cnt++;

}

else {

dp[j] += cnt;

break;

}

}

}

return ans;

}

long long countQuadruplets2(vector& nums) {

int n = nums.size();

long long ans = 0;

vector dp(n, 0);

for (int l = 1; l 

int cnt = 0;

for (int j = 0; j 

if (nums[j] 

ans += dp[j];

cnt++;

}

else {

dp[j] += cnt;

}

}

}

return ans;

}

int main() {

vector nums = { 1, 3, 2, 4, 5 };

cout 

cout 

return 0;

}

在这里插入图片描述

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O0CTz67gjkMkcpULt57qrToQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券