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

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

时间:2024-08-28 14:03:26浏览次数:11  
标签:index arr 数组 val nums int arr2 arr1

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

在这里插入图片描述

标签:index,arr,数组,val,nums,int,arr2,arr1
From: https://www.cnblogs.com/moonfdd/p/18384530

相关文章

  • 【力扣】3145.大数组元素的乘积
    题目描述一个非负整数 x 的 强数组 指的是满足元素为2的幂且元素总和为 x 的最短有序数组。下表说明了如何确定 强数组 的示例。可以证明,x 对应的强数组是独一无二的。数字二进制表示强数组100001[1]801000[8]1001010[2,8]1301101[1,4,8]2310111[1,2,4,16]......
  • Valid注解
     文章链接地址:https://blog.csdn.net/m0_58680865/article/details/127817779文章目录前言一、@Valid注解1、源码解析2、所属的包3、参数校验使用注解(1)空校验(2)Boolean校验(3)长度校验(4)日期校验(5)数值校验(6)其他校验4、具体使用使用@Valid进行参数效验步......
  • 代码随想录day43 || 300 最长递增子序列,674 最长连续递增子序列,718 最长重复子数组
    300最长递增子序列varpath[]intvarresintfunclengthOfLIS(nums[]int)int{ //尝试回溯思路 iflen(nums)==1{ return1 } path=[]int{} res=0 backtracking(nums) returnres}funcbacktracking(nums[]int){ iflen(nums)==0{ iflen(pat......
  • Day09_0.1基础学习MATLAB学习小技巧总结(9)——数组运算
    利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以移步......
  • 代码随想录算法day24 | 贪心算法part02 | 122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!力扣题目链接(opensnewwindow)给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次......
  • 指针(二):数组指针
    目录数组名的理解数组整个地址与数组首元素地址区别指针的形式访问数组冒泡排序二级指针指针数组指针数组模拟二维数组数组名的理解在介绍数组指针之前先通过一段代码了解一下数组名的本质是什么。#include<stdio.h>intmain(){ intarr[]={1,2,3,4,5};......
  • 【Leetcode_Hot100】普通数组
    普通数组53.最大子数组和56.合并区间189.轮转数组238.除自身以外数组的乘积41.缺失的第一个正数53.最大子数组和方法一:暴力解依次遍历数组中的每个子数组,进而判断res的最大值超时classSolution{publicintmaxSubArray(int[]nums){intres=0;......
  • yum install epel-release, except KeyboardInterrupt, e:, SyntaxError: invalid syn
     yuminstallepel-release File"/usr/bin/yum",line30   exceptKeyboardInterrupt,e:                           ^SyntaxError:invalidsyntax问题原因:由于yum包管理是使用python2写的,由于python3与python2不兼容导致出......
  • 数组学习
    1.概念数组是相同类型数据的有序集合每一个数据都称为数组元素2.数组的使用1.声明一个数组:可以在类型后加[](首选)或者在名称后加[](为了方便c和c++语言而设计)2.创建一个数组,并设置内存3.给数组赋值总览3.使用数组长度来计算数组总和如果想计算数组里的数的总和,可......
  • 合并两个排序的数组
     输入:nums1=[1,2,3,0,0,0],m=3nums2=[2,5,6],n=3输出:[1,2,2,3,5,6] publicvoidmergeArray(int[]nums1,intm,int[]nums2,intn){inti=m-1;intj=n-1;intindex=m+n-1;while(index>=0){......