2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr, val)可以返回数组arr中大于val的元素数量。

按照以下规则进行n次操作,将nums中的元素分配到两个数组arr1和arr2中:

1.第一次操作将nums[1]加入arr1。

2.第二次操作将nums[2]加入arr2。

3.对于第i次操作:

3.1.如果arr1中大于nums[i]的元素数量比arr2中大于nums[i]的元素数量多,将nums[i]加入arr1。

3.2.如果arr1中大于nums[i]的元素数量比arr2中大于nums[i]的元素数量少,将nums[i]加入arr2。

3.3.如果arr1和arr2中大于nums[i]的元素数量相等,将nums[i]加入元素数量较少的数组。

3.4.如果仍然相等,则将nums[i]加入arr1。

将arr1和arr2连接起来形成结果数组result。

要求返回整数数组result。

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

输出:[2,3,1,3]。

解释:在前两次操作后,arr1 = [2] ,arr2 = [1] 。

在第 3 次操作中,两个数组中大于 3 的元素数量都是零,并且长度相等,因此,将 nums[3] 追加到 arr1 。

在第 4 次操作中,两个数组中大于 3 的元素数量都是零,但 arr2 的长度较小,因此,将 nums[4] 追加到 arr2 。

在 4 次操作后,arr1 = [2,3] ,arr2 = [1,3] 。

因此,连接形成的数组 result 是 [2,3,1,3] 。

答案2024-08-28:

chatgpt

题目来自leetcode3072。

大体步骤如下:

1.创建一个新的函数greaterCount(arr, val),用于计算数组arr中大于val的元素数量。

2.定义一个空数组arr1arr2,并创建两个BinaryIndexedTree数据结构tree1tree2

3.对于数组nums中的每个元素:

3.1. 将当前元素按照索引排序,并通过Binary Indexed Tree记录每个元素在排序后数组中的位置。

3.2. 进行前两次操作:将nums[0]加入arr1,将nums[1]加入arr2

3.3. 从第三个元素开始遍历:

3.3.1.计算arr1arr2中大于当前元素的个数,并根据规则选择将当前元素加入哪个数组,更新对应的Binary Indexed Tree。

4.返回将arr1arr2连接而成的结果数组result

总的时间复杂度分析为O(n log n),其中n为数组nums的长度。

总的额外空间复杂度为O(n),主要是用于存储排序后的数组、索引映射表、两个Binary Indexed Tree结构以及结果数组。

Go完整代码如下:

package main

import (
"fmt"
"sort"
) type BinaryIndexedTree struct {
tree []int
} func NewBinaryIndexedTree(n int) *BinaryIndexedTree {
return &BinaryIndexedTree{tree: make([]int, n+1)}
} func (bit *BinaryIndexedTree) Add(i int) {
for i < len(bit.tree) {
bit.tree[i]++
i += i & -i
}
} func (bit *BinaryIndexedTree) Get(i int) int {
sum := 0
for i > 0 {
sum += bit.tree[i]
i -= i & -i
}
return sum
} func resultArray(nums []int) []int {
n := len(nums)
sortedNums := make([]int, n)
copy(sortedNums, nums)
sort.Ints(sortedNums)
index := make(map[int]int)
for i, num := range sortedNums {
index[num] = i + 1
} arr1, arr2 := []int{nums[0]}, []int{nums[1]}
tree1, tree2 := NewBinaryIndexedTree(n), NewBinaryIndexedTree(n)
tree1.Add(index[nums[0]])
tree2.Add(index[nums[1]]) for i := 2; i < n; i++ {
count1 := len(arr1) - tree1.Get(index[nums[i]])
count2 := len(arr2) - tree2.Get(index[nums[i]])
if count1 > count2 || (count1 == count2 && len(arr1) <= len(arr2)) {
arr1 = append(arr1, nums[i])
tree1.Add(index[nums[i]])
} else {
arr2 = append(arr2, nums[i])
tree2.Add(index[nums[i]])
}
} return append(arr1, arr2...)
} func main() { nums := []int{2, 1, 3, 3}
fmt.Println(resultArray(nums))
}

rust完整代码如下:

use std::collections::HashMap;

struct BinaryIndexedTree {
tree: Vec<i32>,
} impl BinaryIndexedTree {
fn new(n: usize) -> Self {
BinaryIndexedTree { tree: vec![0; n+1] }
} fn add(&mut self, mut i: usize) {
while i < self.tree.len() {
self.tree[i] += 1;
i += i & (!i + 1);
}
} fn get(&self, mut i: usize) -> i32 {
let mut sum = 0;
while i > 0 {
sum += self.tree[i];
i -= i & (!i + 1);
}
sum
}
} fn result_array(nums: &mut Vec<i32>) -> Vec<i32> {
let n = nums.len();
let mut sorted_nums = nums.clone();
sorted_nums.sort();
let mut index = HashMap::new();
for (i, &num) in sorted_nums.iter().enumerate() {
index.insert(num, i + 1);
} let mut arr1 = vec![nums[0]];
let mut arr2 = vec![nums[1]];
let mut tree1 = BinaryIndexedTree::new(n);
let mut tree2 = BinaryIndexedTree::new(n); tree1.add(*index.get(&nums[0]).unwrap());
tree2.add(*index.get(&nums[1]).unwrap()); for i in 2..n {
let count1 = arr1.len() as i32 - tree1.get(*index.get(&nums[i]).unwrap());
let count2 = arr2.len() as i32 - tree2.get(*index.get(&nums[i]).unwrap()); if count1 > count2 || (count1 == count2 && arr1.len() <= arr2.len()) {
arr1.push(nums[i]);
tree1.add(*index.get(&nums[i]).unwrap());
} else {
arr2.push(nums[i]);
tree2.add(*index.get(&nums[i]).unwrap());
}
} let mut result = vec![];
result.append(&mut arr1);
result.append(&mut arr2);
result
} fn main() {
let mut nums = vec![2, 1, 3, 3];
println!("{:?}", result_array(&mut nums));
}

2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr, val)可以返回数组arr中大于val的元素数量。 按照以下规则进行n次的更多相关文章

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

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

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

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

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

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

  4. 获取数值型数组中大于60的元素个数,给数值型数组中不足60分的加20分。(数组,for循环,if条件判断语句)

    package com.Summer_0420.cn; /** * @author Summer * 获取数值型数组中大于60的元素个数 * 给数值型数组中不足60分的加20分 */ public c ...

  5. 最接近的三数之和(给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数, 使得它们的和与 target 最接近。返回这三个数的和)

    例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2). 思路:首先对数组进行排序     ...

  6. python中大于0的元素全部转化为1,小于0的元素全部转化为0的代码

    [code] """ 大于0的元素全部转化为1 """ np_arr = np.array([[1 ,2, 3, 4]]) print(&q ...

  7. 在Vue.js2.0中组件模板子元素数量问题

    在Vue中当利用组件进行开发时候,组件所使用的模板只可以应用于一个根实例,当你需要添加多个子元素的时候,可以用一个div将它们包裹起来,代码如下: <template id="task ...

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

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

  9. 【C语言】输入三个正整数a,b,c,求最大值,要求定义一个计算最大值的函数max(a,b),返回a,b的值

    #include<stdio.h> int max(int a, int b)/*定义函数*/ { if (a > b) return a; else return b; } int ...

  10. 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案

    var threeSumClosest = function(nums, target) { let ans = nums[0] + nums[1] + nums[2]; const len = nu ...

随机推荐

  1. python基础-基本语句

    1 条件语句 在进行逻辑判断时,我们需要用到条件语句,Python 提供了 if.elif.else 来进行逻辑判断.格式如下所示: 1 if 判断条件1: 2 执行语句1... 3 elif 判断条 ...

  2. 解码技术债:AI代码助手与智能体的革新之道

    技术债 技术债可能来源于多种原因,比如时间压力.资源限制.技术选型不当等.它可以表现为代码中的临时性修补.未能彻底解决的设计问题.缺乏文档或测试覆盖等.虽然技术债可以帮助快速推进项目进度,但长期来看, ...

  3. 从Java开发者到.NET Core初级工程师学习路线:C#语言基础

    1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界!对于刚从Java转过来的开发者来说,你会发现C#和Java有很多相似之处,但C#也有其独特的魅力和强大之处.让我们一起来探索C#的基本语法 ...

  4. yolov5 损失函数代码详解

    前言 模型的损失计算包括3个方面,分别是: 定位损失 分类损失 置信度损失 损失的计算公式如下: 损失计算的代码流程也是按照这三大块来计算的.本篇主要讲解yolov5中损失计算的实现,包括损失的逻辑实 ...

  5. [oeasy]python0066_控制序列_光标位置设置_ESC_逃逸字符_CSI

    光标位置 回忆上次内容 上次讲了 三引号的输出 三引号中 回车和引号 都会 被原样输出 \ 还是需要从 \\转义 黑暗森林 快被摸排清了 还有哪个 转义序列 没 研究过吗? \e是 干什么的? 回忆转 ...

  6. SUM_ACM-Codeforces Round 941 (Div. 2)

    A Card Exchange https://codeforces.com/contest/1966/problem/A 思路:找规律,如果b>a,输出a,如果a中有大于等于b个数,输出b-1 ...

  7. java小技巧~修改对象的属性名

    今天联调的时候,有个功能是在初始化的时候将图片路径回显到vant组件的上传组件上,但是vant组件需要图片路径名叫url,而后端返给我的路径名叫filePath,而且是双层嵌套.一个个遍历老麻烦了,下 ...

  8. Sonar 扫描之分析参数介绍

    Sonar扫描之分析参数介绍 强制参数 服务器 Key 描述 默认 sonar.host.url 服务器网址 http://localhost:9000 项目配置 Key 描述 默认 sonar.pr ...

  9. CF1934B Yet Another Coin Problem 题解

    CF1934B Yet Another Coin Problem 题解 题意 目前有 \(5\) 种硬币,面值分别为 \(1,3,6,10,15\).给你一个数字 \(n\),求出可以凑出 \(n\) ...

  10. windows terminal 添加git bash

    打开windows terminal点击设置 修改文件 找到profiles-->list添加一个节点 { "commandline": "C:\\Program ...