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. 是什么导致了客户端TCP连不上服务器?

      这几年做了很多基于 GGTalk开源即时通讯系统 的定制开发项目,经常会碰到如下两个问题,分享出来,应该对大家会有所帮助: (1)定制开发完成后,在给客户部署GGTalk即时通讯服务端到正式的服务 ...

  2. T3/A40i升级,推荐全志T507-H的5个理由!

    作为能源电力.工业自动化领域的国产中坚力量,全志T3/A40i处理器国产平台一直深受广大客户的喜爱,甚有"国产工业鼻祖处理器"之称.自创龙科技推出T3/A40i全国产工业核心板(S ...

  3. (sql语句试题练习及 参考答案解题思路+个人解题思路)

    SQL字段说明及数据 ======================================================================= 一.部门表字段描述:dp_no 部 ...

  4. vscode插件记录

    前言 vscode因插件而强大. 记录一下好用的插件,以备后续参考. 插件汇总 内容1-14来源于<正点原子 I.MX6U驱动开发指南>4.5节, C/C++,这个肯定是必须的; C/C+ ...

  5. 使用Terminal.Gui构建功能强大的.NET控制台应用

    前言 前段时间分享了一个库帮你轻松的创建漂亮的.NET控制台应用程序 - Spectre.Console的文章教程,然后就有小伙伴提问:.NET控制台应用需要应对强交互性的场景,有什么好的解决方案?, ...

  6. 2. 标签上 title 与 alt 属性的区别是什么?

    1. alt 是给搜索引擎识别,在图像无法显示时的替代文本2. title 是关于元素的注释信息,主要是给用户解读.3.当鼠标放到文字或是图片上时有 title 文字显示.(因为 IE 不标准)在 I ...

  7. 洛谷P1004

    洛谷P1004方格取数 题目大意 本题简要意思就是一个人从一个数字矩阵的左上角走到右下角,只能向下和向右走,拿完的数对应位置变成0,并且这个人要走两次,需要计算两次所拿数的最大值 Train of t ...

  8. 学习笔记--Java方法基础

    Java方法基础 那么什么是方法呢? public class MethodTest01{ public static void main(String[] args){ // 需求1:编写程序计算 ...

  9. 【摘译+整理】System.IO.Ports.SerialPort使用注意

    远古的一篇博客,内容散落于博文和评论 https://sparxeng.com/blog/software/must-use-net-system-io-ports-serialport C# 和 . ...

  10. ceph 001 存储类型 传统存储与分布式存储 分布式文件系统 集群与分布式

    ceph 存储类型 块存储:裸磁盘 未被格式化的磁盘 DAS(直连存储,usb,硬盘插到电脑):scsi接口 接口数量有限 传输距离有限 SAN(存储区域网络):ip-san 网络(iscsi) 以太 ...