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. js: 获取Blob的值

    this.ws.onmessage = async (msg) => { console.log('从服务端获取到了数据') // 从真正服务端发送过来的原始数据时在msg中的data字段 co ...

  2. Vue报错Custom elements in iteration require 'v-bind:key' directives."错误解决

    错误代码 <swiper> <swiper-item v-for="item in banners"> <a :href="item.lin ...

  3. Cilium系列-15-7层网络CiliumNetworkPolicy简介

    系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 介绍 CiliumNetworkPolicies 相比于 Kubernetes 网络策略最大的不同: 7 层网络策略 ...

  4. 【后端面经-数据库】Redis详解——Redis基本概念和特点

    目录 1. Redis基本概念 2. Redis特点 2.1 优点 2.2 缺点 3. Redis的应用场景 面试模拟 参考资料 声明:Redis的相关知识是面试的一大热门知识点,同时也是一个庞大的体 ...

  5. C++算法之旅、05 基础篇 | 第二章 数据结构

    常用代码模板2--数据结构 - AcWing 笔试用数组模拟而不是结构体 使用结构体指针,new Node() 非常慢,创建10万个节点就超时了,做笔试题不会用这种方式(优化是提前初始化好数组,但这样 ...

  6. 使用C#发送邮件支持 Implicit SSL

    安装Package: Install-Package AIM 使用下面的代码发送: class Mail { private static string mailAddress = "{yo ...

  7. IDEA 22.2.3 创建web项目及Tomcat部署与服务器初始界面修改(保姆版)

    开始前请确认自己的Tomcat.JDK已经安装配置完毕 不同版本的IDEA创建配置流程可能不同,演示中的IDEA版本号为22.2.3 本教程创作时间为2023/09/14 1.创建项目 通过下图路径进 ...

  8. (数据科学学习手札154)geopandas 0.14版本新特性一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在前两天,Python生态中 ...

  9. salesforce零基础学习(一百三十一)Validation 一次的bypass设计

    本篇参考: https://admin.salesforce.com/blog/2022/how-i-solved-it-bypass-validation-rules-in-flows 背景:作为系 ...

  10. modbus转profinet网关连接UV系列流量计程序实例

    modbus转profinet网关连接UV系列流量计程序实例 用户现场是西门子1200PLC通过兴达易控Modbus转Profinet网关连接流量计的配置,对流量瞬时值及报警值监控及控制程序案例 硬件 ...