每日一题:优势洗牌

给定两个长度相等的数组nums1和nums2,nums1相对于nums2的优势可以用满足nums1[ i ] > nums2[ i ]的索引 i 的数目来描述。返回nums1的任意排列,使其相对于nums2的优势最大化。

示例 1:

输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出:[2,11,7,15]

示例 2:

输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]

提示:

  • 1 <= nums1.length <= 10^5
  • nums2.length == nums1.length
  • 0 <= nums1[i], nums2[i] <= 10^9

类似于田忌赛马的思路,想让nums1中尽可能多的下标配对比nums2大。

那么可以首先对两个数组进行排序,这样就可以从下标为0处开始遍历(后面都描述为队首)。

  • 如果nums1的队首元素比nums2的队首元素大,那么这就是一组优势。
  • 如果nums1的队首元素比nums2的队首元素小,那么就将nums1的队首和nums2的队尾进行配对。(下等马配上等马)

按照上述思路得到的配对优势最大的合理性分析如下:

  • 首先,如果nums1队首大于nums2队首,即nums1中当前最差的数也能拿到优势,那么比最差数大的其他数将被尽可能的保留了下来,即在保证优势的同时,保证了后手最大化。
  • 其次,虽然可能nums1中的最小数比nums2中第二小甚至更大的数还大,但此时若不与nums2中最小数配对,未来将有一个更大的数和nums2中最小的数配对,大炮打蚊子。
  • 而如果nums1队首小于nums2队首,说明无论如何这个数无法产生优势了,那么就去消耗掉nums2中最大的数,为后面更多产生优势提供帮助。

因为最终要返回和原始nums2数组比对的数组,所以在排序后要知道原始下标,通过以下方式可以实现存储排序后的原始索引:

iota(id1.begin(), id1.end(), 0);
iota(id2.begin(), id2.end(), 0);
sort(id1.begin(), id1.end(), [&](int i, int j) { return nums1[i] < nums1[j]; });
sort(id2.begin(), id2.end(), [&](int i, int j) { return nums2[i] < nums2[j]; });

iota 是 C++ 标准库中的一个函数,它用于将一个序列(如向量、列表或数组)中的元素设置为连续的整数值。具体来说,iota 函数将一个范围内的所有元素初始化为一个初始值开始的连续整数序列。

在本例中,上述代码将idx数组初始化为idx[ i ] = i;

在这段代码中,sort 函数用于对容器 idx 中的元素进行排序,这些整数作为索引,指向另一个容器 nums1 中的元素。排序的依据是 nums1 中对应 id1 索引位置的值的大小。

[&](int i, int j) { return nums1[i] < nums1[j]; }

是一个 lambda 表达式,它定义了一个匿名函数,该函数接受两个整数参数 ij,并返回 nums1[i] 是否小于 nums1[j] 的布尔值。

sort 函数使用这个 lambda 表达式作为比较函数,来确定 id1 中元素的排序顺序。因此,id1中的元素将根据 nums1 中对应元素的值进行升序排序。

举个例子,假设我们有两个容器:

std::vector<int> nums1 = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};  

std::vector<int> id = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

nums1 中,元素是 {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}
id1 中,初始的索引值是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},表示 nums1 中每个元素的原始位置。

执行:

std::sort(id.begin(), id.end(), [&](int i, int j) { return nums1[i] < nums1[j]; });

id1将被重新排序,以反映 nums1 中元素的升序排列。假设排序后的 nums1 元素顺序为 {1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9},那么 id 将变为包含这些元素原始索引的升序排列。

排序后,id 变为 {1, 3, 6, 0, 9, 2, 4, 8, 5, 7, 10}

完整代码:

class Solution {
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        int left = 0;
        int right = n-1;
        vector<int> id1(n);
        vector<int> id2(n);
        vector<int> result(n); 
        iota(id1.begin(), id1.end(), 0);
        iota(id2.begin(), id2.end(), 0);
        sort(id1.begin(), id1.end(), [&](int i, int j) { return nums1[i] < nums1[j]; });
        sort(id2.begin(), id2.end(), [&](int i, int j) { return nums2[i] < nums2[j]; });
        for(int i = 0;i < n;++i){
            if(nums1[id1[i]] > nums2[id2[left]]){
                result[id2[left]] = nums1[id1[i]];
                left++;
            }else{
                result[id2[right]] = nums1[id1[i]];
                right--;
            }
        }
        return result;
    }
};  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

huggingface模型下载至本地并调用教程

huggingface内有许多预训练模型&#xff0c;可以在线调用模型或者将模型部署至本地&#xff0c;但有时候通过网址调用模型会很慢&#xff0c;有些服务器甚至无法通过网址调用… 那么&#xff0c;正题&#xff0c;如何将huggingface的模型部署至本地呢&#xff1f;其实很简单&am…

el-image组件预览图片同时操作页面

背景&#xff1a;el-image组件打开预览效果不能滑动页面。 Q:那么如何才能在打开遮罩层后还能操作页面呢&#xff1f; A:改变遮罩层的大小。CSS3有一个属性width&#xff1a;fit-content&#xff1b;可以解决这个问题。 打开F12看看饿了么的原生样式如下 加上width&#xff1…

R可视化:ggplot2绘制双y轴图

介绍 ggplot2绘制双y轴图加载R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE) library(tidyverse) library(readxl)# rm(list = ls()) options(stringsAsFactors = F) options(future.globals.maxSize = 10000 * 1024^2)Importing data 下载Underdetection of c…

网页自动跳转到其他页面,点击浏览器返回箭头,回不到原来页面的问题

背景&#xff1a;今天产品提个需求&#xff0c;需要从index页面自动触发跳转到下一页面的事件&#xff0c;从而不做任何操作&#xff0c;直接跳转到test页面。 代码是这样的&#xff1a; index.vue: <template><div style"width:500px;height:600px;background-…

(三)Servlet教程——Tomcat安装与启动

首先打开浏览器在浏览器地址栏中输入清华大学开源软件镜像站地址&#xff0c;地址如下 https://mirrors.tuna.tsinghua.edu.cn/ 输入地址后回车会出现如下图所示的界面 在该界面找tomcat不是很好找&#xff0c;在搜索框中输入apache然后回车&#xff0c;输入apache后并回车后出…

WebSocket的原理、作用、API、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 原理作用客户端 API服务端 API生命周期常见注解SpringBoot示例 WebSocket是一种 通信协议 &#xff0c;它在 客户端和服务器之间建立了一个双向通信的网络连接 。WebSocket是一种基于TCP连接上进行 全双工通信 的 协议 。 WebSocket允许客户端和服务器在 单个TCP连接上…

AI道路交通违章智能抓拍系统解决方案

项目概述 背景 目前&#xff0c;XX市市全市民用汽车保有量94.62万辆&#xff0c;比上年末增长15.9%&#xff0c;其中私人汽车保有量35.48万辆&#xff0c;减少0.01%。轿车保有量39.45万辆&#xff0c;增长82.1%&#xff0c;其中私人轿车38.65万辆&#xff0c;增长82.1%。电动自…

【项目实战】基于高并发服务器的搜索引擎

【项目实战】基于高并发服务器的搜索引擎 目录 【项目实战】基于高并发服务器的搜索引擎搜索引擎部分代码index.htmlindex.hpplog.hppparser.cc&#xff08;用于对网页的html文件切分且存储索引关系&#xff09;searcher.hpputil.hpphttp_server.cc&#xff08;用于启动服务器和…

免费https证书申请

HTTPS证书&#xff0c;也称为SSL证书&#xff08;Secure Sockets Layer&#xff09;或TLS证书&#xff08;Transport Layer Security&#xff09;&#xff0c;是一种数字证书&#xff0c;用于在互联网通信中确保数据传输的安全性、完整性和真实性。它是基于公钥基础设施&#x…

VirtualFlow亮相核反应堆技术全国重点实验室2024学术年会

为加强先进核能技术领域科技创新与应用&#xff0c;核反应堆技术全国重点实验室及先进核能技术全国重点实验室2024年学术年会在四川成都启幕&#xff0c;9名院士和近百家科研院所、高校和企业等近700名专家学者齐聚一堂&#xff0c;聚焦和探讨核反应堆及先进核能重大基础理论和…

RAG开山之作:结合参数化与非参数化记忆的知识密集型NLP任务新解法

20年RAG刚提出时的论文&#xff1a;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&#xff0c;也算是RAG的开山之作之一了。 摘要&#xff1a;检索增强生成&#xff08;RAG&#xff09;方法结合了预训练语言模型与基于检索的非参数化记忆&#xff0c;通过…

正整数的性质:和与根

目录 数字和 数字和介绍 数字和简单应用 哈沙德数 最小元素各数位之和 数字根 数字根介绍 数字根简单应用 数字和 数字和介绍 简单来说&#xff0c;数字和即一个整数数字每一位数值相加求和所得的值&#xff0c;数字和可以为任意正整数&#xff0c;使用代码获取一个数值的数字和…

Git笔记-配置ssh

Git在Deepin中的ssh配置 一、环境二、安装1. 查看GitHub账户2. 配置 git3. 生成 ssh key 三、配置 一、环境 系统&#xff1a; Deepin v23 Git仓库&#xff1a;GitHub 二、安装 1. 查看GitHub账户 在设置界面看到自己的邮箱&#xff0c;这个邮箱就是后面会用到的邮箱 2. …

在Java中使用XxlCrawler时防止被反爬的几种方式

目录 前言 一、常见的反爬措施 1、User-Agent识别 2、Referer识别 3、频率限制 4、IP限制 二、XxlCrawer的应对之道 1、User-Agent应对 2、频率限制 3、IP限制 三、XxlCrawler执行解析 1、XxlCrawler对象 2、启动对象 3、信息爬取线程 总结 前言 众所周知&#x…

LAMMPS单层石墨烯建模

本文主要介绍两种晶胞建模方式。 一、Z形晶胞 晶胞分析&#xff1a;a1沿水平x轴方向&#xff0c;a2沿垂直y轴方向。石墨烯是二维结构&#xff0c;a3取小于单层石墨烯厚度。假设石墨烯键长L1.421&#xff0c;则a13L&#xff0c;a21.732L&#xff0c;a32L&#xff08;低于3.35即…

IDEA离线安装插件

1、下载地址 https://plugins.jetbrains.com/idea 如果去其他编辑器&#xff0c;点击下拉&#xff0c;选择即可。 2.搜索 在输入框输入关键词&#xff0c;按照提示选择即可&#xff0c;点击搜索按钮&#xff0c;查看结果。 3、选择版本 按照自己的版本选择合适的版本 4、安…

探索比特币符文热:市场趋势与持续性分析

在加密货币世界中&#xff0c;比特币一直是备受关注的焦点之一。然而&#xff0c;近年来&#xff0c;随着DeFi&#xff08;去中心化金融&#xff09;的兴起&#xff0c;一种新的潮流开始崭露头角——比特币符文。本文将探讨比特币符文的兴起&#xff0c;分析市场趋势&#xff0…

FTP与SMB深度对比:文件传输协议谁更胜一筹?

在数字化时代&#xff0c;文件传输已成为日常工作中不可或缺的一部分。 FTP&#xff08;文件传输协议&#xff09;和SMB&#xff08;服务器消息块&#xff09;是两种最为常见的文件传输协议。它们各自在文件传输领域拥有独特的优势和特点&#xff0c;但同时也存在一些差异。 今…

【学习】软件测试自动化,是未来的趋势还是当前的必需

在当今快速迭代的软件开发周期中&#xff0c;速度和质量成为了企业生存的关键。随着DevOps实践的普及和持续集成/持续部署&#xff08;CI/CD&#xff09;流程的标准化&#xff0c;软件测试自动化已经从未来的趋势转变为当前的必要性。本文将探讨自动化测试的现状、必要性以及其…

C基础语法速览

叠甲&#xff1a;以下文章主要是依靠我的实际编码学习中总结出来的经验之谈&#xff0c;求逻辑自洽&#xff0c;不能百分百保证正确&#xff0c;有错误、未定义、不合适的内容请尽情指出&#xff01; 文章目录 1.数据类型1.1.数据类型的常见分类1.2.数据类型的符号修饰1.3.数据…
最新文章