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) 满足以下条件,我们称它是上升的:
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) 满足的更多相关文章
- 输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少
输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少? 例子:输入数字9,则输出结果位9.因为[0-9]中,只有数字7有连续的三个‘1’出现,别的都没有,所以一共有9个数字 ...
- 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
/** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
- 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表
这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...
- 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 ...
- 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nu ...
- 在排序数组中查找元素的第一个和最后一个位置(给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。)
示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出 ...
- #有如下值集合[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 ...
- 整数数组的定义,然后输入一个整数X,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j
//整数数组的定义,然后输入一个整数x,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j: //如果X在该阵列,返回位置的阵列中的数. 资源: #include<iostr ...
- 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[& ...
随机推荐
- js: 获取Blob的值
this.ws.onmessage = async (msg) => { console.log('从服务端获取到了数据') // 从真正服务端发送过来的原始数据时在msg中的data字段 co ...
- Vue报错Custom elements in iteration require 'v-bind:key' directives."错误解决
错误代码 <swiper> <swiper-item v-for="item in banners"> <a :href="item.lin ...
- Cilium系列-15-7层网络CiliumNetworkPolicy简介
系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 介绍 CiliumNetworkPolicies 相比于 Kubernetes 网络策略最大的不同: 7 层网络策略 ...
- 【后端面经-数据库】Redis详解——Redis基本概念和特点
目录 1. Redis基本概念 2. Redis特点 2.1 优点 2.2 缺点 3. Redis的应用场景 面试模拟 参考资料 声明:Redis的相关知识是面试的一大热门知识点,同时也是一个庞大的体 ...
- C++算法之旅、05 基础篇 | 第二章 数据结构
常用代码模板2--数据结构 - AcWing 笔试用数组模拟而不是结构体 使用结构体指针,new Node() 非常慢,创建10万个节点就超时了,做笔试题不会用这种方式(优化是提前初始化好数组,但这样 ...
- 使用C#发送邮件支持 Implicit SSL
安装Package: Install-Package AIM 使用下面的代码发送: class Mail { private static string mailAddress = "{yo ...
- IDEA 22.2.3 创建web项目及Tomcat部署与服务器初始界面修改(保姆版)
开始前请确认自己的Tomcat.JDK已经安装配置完毕 不同版本的IDEA创建配置流程可能不同,演示中的IDEA版本号为22.2.3 本教程创作时间为2023/09/14 1.创建项目 通过下图路径进 ...
- (数据科学学习手札154)geopandas 0.14版本新特性一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在前两天,Python生态中 ...
- salesforce零基础学习(一百三十一)Validation 一次的bypass设计
本篇参考: https://admin.salesforce.com/blog/2022/how-i-solved-it-bypass-validation-rules-in-flows 背景:作为系 ...
- modbus转profinet网关连接UV系列流量计程序实例
modbus转profinet网关连接UV系列流量计程序实例 用户现场是西门子1200PLC通过兴达易控Modbus转Profinet网关连接流量计的配置,对流量瞬时值及报警值监控及控制程序案例 硬件 ...