3072. 将元素分配到两个数组中 II Rust 线段树 + 离散化

news2025/1/11 20:47:44

题目

给你一个下标从 1 开始、长度为 n 的整数数组 nums

现定义函数 greaterCount ,使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。

你需要使用 n 次操作,将 nums 的所有元素分配到两个数组 arr1arr2 中。在第一次操作中,将 nums[1] 追加到 arr1 。在第二次操作中,将 nums[2] 追加到 arr2 。之后,在第 i 次操作中:

如果 greaterCount(arr1, nums[i]) > greaterCount(arr2, nums[i]) ,将 nums[i] 追加到 arr1
如果 greaterCount(arr1, nums[i]) < greaterCount(arr2, nums[i]),将 nums[i] 追加到 arr2
如果 greaterCount(arr1, nums[i]) == greaterCount(arr2, nums[i]) ,将 nums[i] 追加到元素数量较少的数组中。
如果仍然相等,那么将 nums[i] 追加到 arr1
连接数组 arr1arr2 形成数组 result 。例如,如果 arr1 == [1,2,3]arr2 == [4,5,6] ,那么 result = [1,2,3,4,5,6]

返回整数数组 result

示例

示例 1

输入: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] 。

示例 2

输入:nums = [5,14,3,1,2]
输出:[5,3,1,2,14]
解释:在前两次操作后,arr1 = [5] ,arr2 = [14] 。
在第 3 次操作中,两个数组中大于 3 的元素数量都是一,并且长度相等,因此,将 nums[3] 追加到 arr1 。
在第 4 次操作中,arr1 中大于 1 的元素数量大于 arr2 中的数量(2 > 1),因此,将 nums[4] 追加到 arr1 。
在第 5 次操作中,arr1 中大于 2 的元素数量大于 arr2 中的数量(2 > 1),因此,将 nums[5] 追加到 arr1 。
在 5 次操作后,arr1 = [5,3,1,2] ,arr2 = [14] 。
因此,连接形成的数组 result 是 [5,3,1,2,14] 。

示例 3

输入:nums = [3,3,3,3]
输出:[3,3,3,3]
解释:在 4 次操作后,arr1 = [3,3] ,arr2 = [3,3] 。
因此,连接形成的数组 result 是 [3,3,3,3] 。

提示:

3 <= n <= 105
1 <= nums[i] <= 109

思路

离散化 + 线段树,由于基础的线段树可以AC,不再使用懒标记去优化。

AC代码

use std::collections::HashMap;

struct Tree{
    tree: Vec<i32>
}

impl Tree {
    pub fn new(len: usize) -> Self {
        Tree {
            tree: vec![0; len]
        }
    }

    /**
     * 更新
     **/
    pub fn update(&mut self, node: usize, sign_idx: usize, l: usize, r: usize) {
        if l == r {
            self.tree[node] += 1;
            return;
        }
        let mid: usize = l + r >> 1;
        let l_node: usize = (node << 1) + 1;
        let r_node: usize = l_node + 1;
        if sign_idx <= mid {
            self.update(l_node, sign_idx, l, mid);
        } else {
            self.update(r_node, sign_idx, mid + 1, r);
        }
        self.tree[node] = self.tree[l_node] + self.tree[r_node];
    }

    /**
     * 查询
     **/
    pub fn query(&mut self, node: usize, l: usize, r: usize, start: usize, end: usize) -> i32 {
        if l > end || r < start {
            return 0;
        }
        if l >= start && r <= end {
            return self.tree[node];
        }
        let mid: usize = l + r >> 1;
        let l_node: usize = (node << 1) + 1;
        let r_node: usize = l_node + 1;
        self.query(l_node, l, mid, start, end) + self.query(r_node, mid + 1, r, start, end)
    }
}

impl Solution {
    pub fn result_array(v: Vec<i32>) -> Vec<i32> {
        let len: usize = v.len();
        let tree_len: usize = len << 2;
        let mut tree1: Tree = Tree::new(tree_len);
        let mut tree2: Tree = Tree::new(tree_len);
        let mut arr1: Vec<i32> = vec![v[0]];
        let mut arr2: Vec<i32> = vec![v[1]];
        let mut mp: HashMap<usize, usize> = HashMap::new();
        let mut cp_v: Vec<i32> = v.clone();
        cp_v.sort();
        
        for (idx, tem) in cp_v.iter().enumerate() {
            mp.insert(*tem as usize, idx);
        }

        if let Some(tem_val) = mp.get(&(v[0] as usize)) {
            tree1.update(0, *tem_val, 0, len - 1);
        }
        
        if let Some(tem_val) = mp.get(&(v[1] as usize)) {
            tree2.update(0, *tem_val, 0, len - 1);
        }
        
        for idx in 2 .. len {
            let val: i32 = v[idx];
            let mut mp_val: usize = 0;

            if let Some(tem_val) = mp.get(&(val as usize)) {
                mp_val = *tem_val;
            }            
            
            let s1: i32 = tree1.query(0, 0, len - 1, mp_val + 1, len - 1);
            let s2: i32 = tree2.query(0, 0, len - 1, mp_val + 1, len - 1);

            if s1 > s2 {
                arr1.push(val);
                tree1.update(0, mp_val, 0, len - 1);
                continue;
            }

            if s2 > s1 {
                arr2.push(val);
                tree2.update(0, mp_val, 0, len - 1);
                continue;
            }

            let len1: usize =  arr1.len();
            let len2: usize = arr2.len();
            
            if len1 <= len2 {
                arr1.push(val);
                tree1.update(0, mp_val, 0, len - 1);
            } else {
                arr2.push(val);
                tree2.update(0, mp_val, 0, len - 1);
            }
        }

        arr1.extend(arr2);
        arr1
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1791823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走&#xff0c;解决你的问题&#xff0c;如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …

PPT的文件怎么做二维码?适合多种文件使用的二维码制作技巧

现在很多人会将ppt文件转换成二维码之后&#xff0c;分享给其他人查看&#xff0c;比如常见的有学习资料、作品展示、个人简历、方案计划等内容都可以通过生成二维码的方式来提供展示。通过手机扫码就能够快速预览文件内容&#xff0c;与使用邮箱或网盘传输相比&#xff0c;更加…

SpaceX 首席火箭着陆工程师 MIT论文详解:非凸软着陆最优控制问题的控制边界和指向约束的无损凸化

上一篇blog翻译了 Lars Blackmore(Lars Blackmore is principal rocket landing engineer at SpaceX)的文章&#xff0c;SpaceX 使用 CVXGEN 生成定制飞行代码,实现超高速机载凸优化。利用地形相对导航实现了数十米量级的导航精度,着陆器在着陆过程中成像行星表面并将特征与机载…

Python考试复习--day7

1.IP地址转换I ipinput() if len(ip)32 and set(ip)<{0,1}:print(..join([ str(int(ip[8*i:8*(i1)],2)) for i in range(4)])) else:print(data error!) 2.找数字&#xff0c;做加法 ainput() binput() d1 d2 for i in a:if i.isnumeric():d1i for i in b:if i.isnumeric(…

RabbitMQ支持的消息模型

RabbitMQ基础RabbitMQ支持的消息模型 一、第一种模型(直连) 我们将用Java编写两个程序&#xff0c;发送单个消息的生成者和接收消息并打印出来的消费者。 在下图&#xff0c;“P”是生成者&#xff0c;“C”消费者。中间框是一个队列RabbitMQ保留的消息缓冲区 。 首先构建一个…

十一、完善增删改查操作

分为两部分&#xff1a; 第一部分在解析xml的时候&#xff0c;要解析select、insert、update、delete的语句&#xff0c;封装成mapperStatement放到configuration中 第二部分在执行的时候&#xff0c;执行到代理类的invoke方法&#xff0c;然后在MapperMethod判断执行增删改查…

dns域名解析服务和bond网卡

目录 dns域名解析服务 一、DNS 1、定义 2、以www.baidu.com为例 3、域名体系结构 4、DNS解析使用的协议和端口 5、dns域名解析的过程 6、dns解析的优先级 二、如何实现域名解析 1、域名解析 2、bind配置文件位置 &#xff08;一&#xff09;正向解析 &#xff08;…

基础数学-求平方根(easy)

一、问题描述 二、实现思路 1.题目不能直接调用Math.sqrt(x) 2.这个题目可以使用二分法来缩小返回值范围 所以我们在left<right时 使 mid (leftright)/21 当mid*mid>x时&#xff0c;说明right范围过大&#xff0c;rightright-1 当mid*mid<x时&#xff0c;说明left范…

圈子社区系统源码 开源 多端圈子社区论坛系统 社区圈子管理系统

介绍 圈子论坛小程序&#xff0c;是一款为用户提供交流分享、互动沟通的平台。在这个小程序中&#xff0c;用户可以轻松地加入各种不同兴趣爱好的圈子&#xff0c;与志同道合的朋友们交流互动。圈子论坛小程序不仅仅是一个简单的社交工具&#xff0c;更是一个打开新世界大门的…

CUDA12.0 + cuDNN9.0.0安装

目录 1. 查看显卡支持的CUDA版本1.1 指令查看1.2 控制面板查看 2. 安装CUDA2.1 下载2.2 安装2.3 验证 3. 安装cuDNN3.1 下载3.2 安装3.2 验证 1. 查看显卡支持的CUDA版本 1.1 指令查看 打开cmd输入nvidia-smiDriver Version表示显卡驱动版本&#xff0c;CUDA Version表示支持…

三维前端开发项目中Threejs的THREEScene函数详解

THREE.Scene函数用于创建一个场景对象。大家好&#xff01;艾斯视觉作为在IT行业中负责ui设计和前端开发环节的服务商很高兴能在这里与大家共同探讨学习&#xff1a;场景是 Three.js 中所有图形元素的容器&#xff0c;它可以包含相机、光源、几何体、材质等。 创建场景对象的基…

【control_manager】无法加载,gazebo_ros2_control 0.4.8,机械臂乱飞

删除URDF和SDRF文件中的特殊注释#, !,&#xff1a; xacro文件解析为字符串时出现报错 一开始疯狂报错Waiting for /controller_manager node to exist 1717585645.4673686 [spawner-2] [INFO] [1717585645.467015300] [spawner_joint_state_broadcaster]: Waiting for /con…

【UE5.1 角色练习】11-坐骑——Part1(控制大象移动)

前言 在上一篇&#xff08;【UE5.1 角色练习】10-物体抬升、抛出技能 - part2&#xff09;基础上创建一个新的大象坐骑角色&#xff0c;并实现控制该角色行走的功能。 效果 步骤 1. 在商城中下载“African Animal Pack”资产和“ANIMAL VARIETY PACK”资产导入工程中 2. 复…

猫熊超市管理系统

import java.util.Scanner;//增加商品类 //此类用来录入一个商品的所有属性&#xff0c;并作为结果对其返回 public class Add {public Goods add1() {Scanner scanner new Scanner(System.in);System.out.println("请输入商品名称");String name scanner.next();S…

处理一对多的映射关系

一对多关系&#xff0c;比如说根据id查询一个部门的部门信息及部门下的员工信息 在Dept类中先添加List emps属性 1、collection DeptMapper.xml文件中 <resultMap id"deptAndEmpResultMap" type"Dept"><id property"did" column&qu…

【c++设计模式17】行为模式2:命令模式(Command Pattern)

【c设计模式17】行为模式2&#xff1a;命令模式&#xff08;Command Pattern&#xff09; 一、定义二、适用场景三、过程四、命令模式类图五、C示例代码六、使用注意事项 原创作者&#xff1a;郑同学的笔记 原创地址&#xff1a;https://zhengjunxue.blog.csdn.net/article/det…

面试官:你知道 ES6 的 生成器 Generator 吗?小明:说起 Generator,还得从我上次去餐馆点餐开始说起。

讲故事学 Generator 这篇文章先说一个小故事&#xff0c;作为引子&#xff0c;然后系统讲讲 Generator。阅读这篇文章的话&#xff0c;需要一些前置知识&#xff1a;起码用过 Promise 和 async/await。 小故事 吃货小明去了一家菜鸟镇非常有名的餐馆——《老三样餐馆》&…

如何修改cPanel面板的语言

本周有一个客户&#xff0c;购买Hostease的主机&#xff0c; 客户购买的是Linux虚拟主机&#xff0c;带cPanel面板的。询问我们的在线客服&#xff0c;他想修改cPanel面板的默认语言。Hostease虚拟主机默认英语&#xff0c;客户想要修改成中文。 在cPanel面板中修改语言设置是一…

3 - 大的国家(高频 SQL 50 题基础版)

3.大的国家 -- 查询属性&#xff1a;国家名称、人口和面积 select name,population,area fromWorld where area>3000000 OR population>25000000;

React中常见的面试题

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! 1. 约束性组件与非约束性组件 1.1. 非约束性组件 非约束性组件其实就是不能控制状态的组件,比如: <input type"text" defaultValue"123&qu…