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;
}

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

  1. 输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少

    输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少? 例子:输入数字9,则输出结果位9.因为[0-9]中,只有数字7有连续的三个‘1’出现,别的都没有,所以一共有9个数字 ...

  2. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  3. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  4. 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表

    这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  5. Gym 101606 - A/B/C/D/E/F/G/H/I/J/K/L - (Undone)

    链接:https://codeforces.com/gym/101606 A - Alien Sunset 暴力枚举小时即可. #include<bits/stdc++.h> using ...

  6. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    class Solution {     public int[] twoSum(int[] nums, int target) {         for (int i = 0; i < nu ...

  7. 在排序数组中查找元素的第一个和最后一个位置(给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。)

    示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出 ...

  8. #有如下值集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66值保存至字典的一个key中,将小于66的值保存至大二个key的值

    #!/usr/bin/env python #有如下值集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66值保存至字典的一个key中,将小于66的值保存至大二个ke ...

  9. 整数数组的定义,然后输入一个整数X,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j

    //整数数组的定义,然后输入一个整数x,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j: //如果X在该阵列,返回位置的阵列中的数. 资源: #include<iostr ...

  10. 08 集合[11,22,33,44,55,66,77,88,99],将所有<66的值保存至字典的第一个key中,将所有>=66的值保存至字典的第二个key中。即:{'k1':<66的所有值,'k2':>=66的所有值}

    li = [11,22,33,44,55,66,77,88,99]dict = {'k1':[],'k2':[]}for i in li:    if i < 66:        dict[& ...

随机推荐

  1. Vue中 router与route的区别

    $route对象 该对象表示当前的路由信息,包含当前URL解析得到的信息.包含当前的路径,参数,query对象等.其常用方法如下所示: $route.path 字符串,对应当前路由的路径,总是解析为绝 ...

  2. K8S | Service服务发现

    服务发现与负载均衡. 一.背景 在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关.注册中心.配置中心等相关服务,可以被集群外部访问: 对于测试「Tes」环境或者 ...

  3. 明白error类型让你更快定位开发报错

    在javascript中,开发遇到的项目报错,很多时候都是通过 Error 这个类来展示的,清楚Error的类型可以更好定位项目中的问题 Error的类型 Error Error是所有其它错误的父类, ...

  4. React中setState的使用与同步异步

    在react中,修改状态如果直接使用this.state,不会引起组件的重新渲染,需要通过 this.setState来对组件的属性进行修改. 1.this.setState的两种定义方式 定义初始状 ...

  5. 简单搭建基本Prometheus监控系统

    前言 适用场景:新手入门:内网离线部署,只是需要了解服务器基本情况,不需要告警系统. 需要准备的安装包: grafana的docker包(先在线下载,然后docker save保存镜像.如果没有doc ...

  6. 1.创建一个类,类A中定义了一个方法,该方法能接受3个参数根据参数判断是做加法还是减法并返回计算结果;

    class A: def cal(self,x,y,z): if z=='+': return x+y if z=='-': return x-y else: print('error') a=A() ...

  7. Redis专题-队列

    Redis专题-队列 首先,想一想 Redis 适合做消息队列吗? 1.消息队列的消息存取需求是什么?redis中的解决方案是什么? 无非就是下面这几点: 0.数据可以顺序读取 1.支持阻塞等待拉取消 ...

  8. [Lua][Love Engine] 有效碰撞处理の类别与位掩码 | fixture:setFilterData

    有效的碰撞处理 只用IF判断 假设在一个物理世界,不希望两个同类实体发生碰撞,那么 local begin_contact_callback = function(fixture_a, fixture ...

  9. [ABC149E] Handshake

    2023-03-06 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 二分 解题思路 因为按照贡献从大到小握手一定是最优的,所以将 \(a\) ...

  10. Effective C++ 笔记(二)

    16.保证异常安全 1 void PrettyMenu::changBackground(std::istream &imgSrc) 2 { 3 lock(&mutex); 4 del ...