力扣每日一题 6/5

3072.将元素分配到两个数组中 II [困难]

题目:

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

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

你需要使用 n 次操作,将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操作中,将 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 。

连接数组 arr1 和 arr2 形成数组 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 <= 10**5
  • 1 <= nums[i] <= 10**9

题目分析:

 这道题的话,题目还是比较容易理解的,就是对复杂度要求有点高,毕竟数据量摆在这呢,大致的思路就是模拟,模拟他分配的过程。 在这道题中引入了SortedList函数,下面先讲解一下SortedList函数:

        SortedList是Python语言中的一个模块,用于实现排序列表数据结构的类。这个模块提供了一个名为SortedList的类,可以很方便地对列表进行排序操作。sortedlist模块包含了对列表的各种操作,如插入、删除、查找、切片等,并且能够保持列表中的元素是有序的状态。通过使用sortedlist模块,可以更容易地对列表进行排序和查找操作,提高代码的效率和可读性。下面是代码示例:

from sortedlist import SortedList# 创建一个空的排序列表
slist = SortedList()# 向排序列表中插入元素
slist.add(5)
slist.add(2)
slist.add(8)
slist.add(3)# 打印排序后的列表
print(slist)  # 输出: SortedList([2, 3, 5, 8])# 使用index方法查找元素的索引
index = slist.index(5)
print(index)  # 输出: 2# 使用remove方法删除列表中的元素
slist.remove(3)
print(slist)  # 输出: SortedList([2, 5, 8])

        总体来说,这个函数是列表的一种,他可以实现加入每一个元素都对齐进行插入排序,且复杂度很低,可以达到O(nlogn),对于这道题他可以很方便的帮我们计算出来比nums[i]绝对大的数字有几个。

代码实现:

from sortedcontainers  import SortedList
class Solution:def resultArray(self, nums: List[int]) -> List[int]:arr1=SortedList()arr2=SortedList()arr1.add(nums[0])arr2.add(nums[1])res1=[nums[0]]res2=[nums[1]]def ar(ls, h): return len(ls) - ls.bisect_right(h) for i in range(2,len(nums)):k1=ar(arr1,nums[i])k2=ar(arr2,nums[i])# print(k1,k2)if k1<k2:arr2.add(nums[i])res2.append(nums[i])elif  k1==k2:if len(arr1)<=len(arr2):arr1.add(nums[i])res1.append(nums[i])# print(len(arr1),len(arr2))else: arr2.add(nums[i])res2.append(nums[i])else:arr1.add(nums[i])res1.append(nums[i])res1.extend(res2)return res1

 总结:

        此函数采用排序列表数据结构,以O(log(n))时间复杂度插入元素。然后,通过比较当前插入元素与先前插入的元素的相对位置,选择在哪个列表中添加插入元素。最终返回混合列表,其中元素按顺序添加。具体步骤如下:

  1. 创建两个空的排序列表arr1和arr2,分别用来存储比较小的元素和比较大的元素。
  2. 将列表中的前两个元素分别加入到arr1和arr2中,同时分别将这两个元素也添加到两个结果列表res1和res2中。
  3. 定义一个辅助函数ar(ls, h),用来计算列表ls中比元素h大的元素的数量。
  4. 从第3个元素开始遍历列表,对每个元素执行以下操作:
    • 分别计算该元素在arr1和arr2中大于该元素的元素数量,保存为k1和k2。
    • 如果k1 < k2,将该元素添加到arr2和res2中。
    • 如果k1 == k2,比较arr1和arr2的长度,将该元素添加到较短的列表中,并将该元素添加到res1或res2中。
    • 如果k1 > k2,将该元素添加到arr1和res1中。
  5. 合并res1和res2,并返回结果。

        通过这种方法,可以将元素按照大小有序地插入到两个列表中,最终得到一个按照排好序的结果列表。

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

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

相关文章

用增之Google GA4F

目录 简介 Google开发文档 开发提炼(走过的坑) DDL代码环节 1、深层链接简介 2、assetlinks.json发布 3、 测试deeplink 4、完成以上操作步骤DDL的前置工作已经做好,在已安装app的情况,所有打开app的链路已经走通,最后就是Firebase 来接收ddl

semaphore | 使用web界面的ansible来批量运维 linux、windows主机

Ansible 的现代化 UI &#xff0c;可以轻松管理和运行 Ansible playbook&#xff0c;功能强大&#xff0c;操作简单&#xff0c;支持中文。 文章目录 一、系统功能说明二、系统安装2.1 直接安装2.2 docker 安装 三、系统使用3.1 建立存储库3.2 编写代码3.3 建立主机配置3.3 建立…

C++课程设计杭电题目(下)

2076.夹角有多大(题目已修改,注意读题) 题目描述 http://acm.hdu.edu.cn/showproblem.php?pid2076 Problem Description 时间过的好快&#xff0c;一个学期就这么的过去了&#xff0c;xhd在傻傻的看着表&#xff0c;出于对数据的渴望&#xff0c;突然他想知道这个表的时针…

南卡、韶音、Cleer、漫步者开放式耳机好用吗?最强开放式耳机对比揭秘!

在挑选开放式耳机时&#xff0c;个人经验和实际需求应当优先考虑&#xff0c;而非盲目追随潮流或品牌效应。投资耳机前务必慎重&#xff0c;毕竟高价值商品若无法退换&#xff0c;难免造成遗憾。为了帮助大家做出更加明智的决策&#xff0c;我亲自出资购买并测试了市面上多款主…

重生奇迹mu魔剑士

1、魔剑士低端装备-SF10(升级)亚特传说等S-S(PK)亚特奔雷魔神等。评价:优越的极品双属卓越,极其高的性价比,造福穷人玩家的装。 2、中端装备(只适合力魔剑士)-SF10S-S天魔斗神评价&#xff1a;与低级亚特等一样不过由于成本,装备PVP属性等原因,价钱稍贵点。 3、中端套装(只适合…

使用Python实现深度学习模型:序列到序列模型(Seq2Seq)

序列到序列&#xff08;Seq2Seq&#xff09;模型是一种深度学习模型&#xff0c;广泛应用于机器翻译、文本生成和对话系统等自然语言处理任务。它的核心思想是将一个序列&#xff08;如一句话&#xff09;映射到另一个序列。本文将详细介绍 Seq2Seq 模型的原理&#xff0c;并使…

49.字母异位词分组

49.字母异位词分组 /*** param {string[]} strs* return {string[][]}*/ var groupAnagrams function(strs) {const map new Object;for(let str of strs){let arr new Array(26).fill(0);for(let s of str){arr[s.charCodeAt() - a.charCodeAt()];}//数组直接作为对象的键…

【Web API DOM08】事件汇总(加载事件、滚动事件)

一&#xff1a;页面加载事件 1 概述&#xff1a; 页面加载指加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时&#xff0c;触发事件 2 load事件 监听页面所有资源加载完毕 //页面加载事件 //window 对象表示一个包含 DOM 文档的窗口 window.…

【阿里前端面试题】聊聊前端性能优化的方案,解决过什么样的性能问题?

大家好&#xff0c;我是“寻找DX3906”。每天进步一点。日积月累&#xff0c;有朝一日定会厚积薄发&#xff01; 前言&#xff1a; 前面已经和大家分享了4篇面试题&#xff1a; 《【阿里前端面试题】浏览器的加载渲染过程》 《【阿里前端面试题】客户端和服务器交互&#xff…

IO流----字节流

字节流 字节流&#xff1a;操作&#xff1a;文件字节输入输出流 &#xff1a;写入数据&#xff1a;读取数据&#xff1a;文件拷贝&#xff1a; 带缓冲区的字节输入输出流&#xff1a;拷贝文件&#xff1a;写入数据&#xff1a;读取数据: 深入 带缓冲区的字节输出流 &#xff1a…

Java线程池execute和submit的区别

前言 ThreadPoolExecutor提供了两种方法来执行异步任务&#xff0c;分别是execute和submit&#xff0c;也是日常开发中经常使用的方法&#xff0c;那么它俩有什么区别呢&#xff1f; 语义不同 首先是语义上的不同。execute声明在Executor接口&#xff0c;它接受一个Runnable…

【论文阅读】Point2RBox (CVPR’2024)

paper:https://arxiv.org/abs/2311.14758 code:https://github.com/yuyi1005/point2rbox-mmrotate

阿里云sls 采集日志安装记录

参考阿里云给的安装文档 阿里云安装Logtail组件 注意这里&#xff0c;选择地域&#xff0c;是中国地域选中国&#xff0c;海外选海外即可 按照文档继续下去 修改配置文件./alibaba-cloud-log-all/values.yaml 所有的操作完成后&#xff0c;去控制台配置 以上操作的前提是…

[WWW2024]轻量数据依赖的异常检测重训练方法LARA

开篇 近日&#xff0c;由阿里云计算平台大数据基础工程技术团队主导&#xff0c;与浙江大学合作的论文《LARA: ALight and Anti-overfitting Retraining Approach for Unsupervised Time Series Anomaly Detection 》被WWW2024收录&#xff0c;该方法解决了云服务正常模式随时…

探索AIGC降重工具:确保论文原创性的新策略

如何有效降低AIGC论文的重复率&#xff0c;也就是我们说的aigc如何降重&#xff1f;AIGC疑似度过高确实是个比较愁人的问题。如果你用AI帮忙写了论文&#xff0c;就一定要在交稿之前做一下AIGC降重的检查。一般来说&#xff0c;如果论文的AIGC超过30%&#xff0c;很可能会被判定…

申请医疗设备注册变更时,需要补充考虑网络安全的情况有哪些?

在申请医疗器械设备注册变更时&#xff0c;需要补充网络安全的情况主要包括以下几点&#xff1a; 网络安全功能更新&#xff1a;如果医疗器械的自研软件发生网络安全功能更新&#xff0c;或者合并网络安全补丁更新的情形&#xff0c;需要单独提交一份自研软件网络安全功能更新…

#02 安装指南:如何配置Stable Diffusion环境

文章目录 前言前置条件第1步&#xff1a;安装Python和PIP第2步&#xff1a;创建虚拟环境第3步&#xff1a;安装PyTorch和CUDA第4步&#xff1a;安装Stable Diffusion相关库第5步&#xff1a;测试环境结论 前言 在之前的文章中&#xff0c;我们介绍了Stable Diffusion基础入门和…

【ARFoundation自学04】AR Tracked Image 图像追踪识别

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体&#xff08;UI、模型等&#xff09;

Java驱动的工程项目管理系统:实现高效协作与精准管理

在工程行业的现代管理实践中&#xff0c;有效地协同工作和信息共享对于提高工作效率和降低成本至关重要。本文将深入探讨一款基于Java技术的工程项目管理系统&#xff0c;该系统采用前后端分离的架构&#xff0c;功能全面&#xff0c;旨在满足不同角色的需求&#xff0c;从项目…

go语言切片去重的3种方式总结

go语言中的切片是使用非常频繁的一个数据结构&#xff0c;对于他的去重&#xff0c;我们可以有以下3种方式 1. 切片slice去重 利用map的key不能重复的特性append函数 一次for循环搞定 这个模式时间复杂度最低&#xff0c;效率最高&#xff0c; 如果go版本大于1.21推荐使用这…