分治-归并排序-逆序对问题

目录

1.升序(以右边的合并组为基准)

2.降序(以左边的合并组为基准)

 3.逆对序--固定下标

1.升序(以右边的合并组为基准)

找出左边有多少个数比我(nums[right])大

  • 应该在每一次合并之前,进行逆序对查找
  • 每一个该合并的组都是按升序排列,所以当nums[left]<nums[right]时,应该left++,因为都是升序,所以当nums[left]>nums[right],right++时,left从当前位置不动。

class Solution {
public:vector<int> ret;int vim=0;int reversePairs(vector<int>& record) {ret.resize(record.size());mergesort(record,0,record.size()-1);return vim;}void merge(vector<int>&nums,int low,int high,int mid){int left=low,right=mid+1, i=0;while(left<=mid&&right<=high){if(nums[left]<=nums[right]) ret[i++]=nums[left++];else  {ret[i++]=nums[right++];vim+=(mid+1-left);}}while(left<=mid) ret[i++]=nums[left++];while(right<=high) ret[i++]=nums[right++];for(int i=0;i<high-low+1;i++){nums[i+low]=ret[i];}}void mergesort(vector<int>&nums,int low,int high){if(low>=high) return;int mid=(low+high)/2;mergesort(nums,low,mid);mergesort(nums,mid+1,high);merge(nums,low,high,mid);}
};

2.降序(以左边的合并组为基准)

 找出多少个数比我小

 合并过程:

 

class Solution {
public:vector<int> ret;int vim=0;int reversePairs(vector<int>& record) {ret.resize(record.size());mergesort(record,0,record.size()-1);return vim;}void merge(vector<int>&nums,int low,int high,int mid){int left=low,right=mid+1, i=0;while(left<=mid&&right<=high){if(nums[left]>nums[right]) {vim+=(high-right+1);ret[i++]=nums[left++];}else  {ret[i++]=nums[right++];}}while(left<=mid) ret[i++]=nums[left++];while(right<=high) ret[i++]=nums[right++];for(int i=0;i<high-low+1;i++){nums[i+low]=ret[i];}}void mergesort(vector<int>&nums,int low,int high){if(low>=high) return;int mid=(low+high)/2;mergesort(nums,low,mid);mergesort(nums,mid+1,high);merge(nums,low,high,mid);}
};

 对比:

降序升序

void merge(vector<int>&nums,int low,int high,int mid)
    {
        int left=low,right=mid+1, i=0;
        while(left<=mid&&right<=high)
        {
             if(nums[left]>nums[right]) 
             {
                vim+=(high-right+1);
                ret[i++]=nums[left++];
             }
            else  
             ret[i++]=nums[right++];

}
        while(left<=mid) ret[i++]=nums[left++];
        while(right<=high) ret[i++]=nums[right++];
        for(int i=0;i<high-low+1;i++)
        {
            nums[i+low]=ret[i];
        }
    }

 void merge(vector<int>&nums,int low,int high,int mid)
    {
        int left=low,right=mid+1, i=0;
        while(left<=mid&&right<=high)
        {
             if(nums[left]<=nums[right])                 ret[i++]=nums[left++];
            else  
            {
                ret[i++]=nums[right++];
                vim+=(mid+1-left);
            }

        }
        while(left<=mid) ret[i++]=nums[left++];
        while(right<=high) ret[i++]=nums[right++];
        for(int i=0;i<high-low+1;i++)
        {
            nums[i+low]=ret[i];
        }
    }

 3.逆对序--固定下标

增加一个下标数据,和交换下标数组,当交换数组发生数据交换时,交换下标数组也要发生数据交换

 

class Solution {vector<int> tempnums,index,tempindex,count;
public:vector<int> countSmaller(vector<int>& nums) {int n=nums.size();tempnums.resize(n);//交换数组tempindex.resize(n);//交换下标index.resize(n);//存放原始下表count.resize(n);//存放结果for(int i=0;i<n;i++) index[i]=i;mergesort(nums,0,n-1);return count;}void merge(vector<int>&nums,int low,int high,int mid){int left=low,right=mid+1,i=0;while(left<=mid&&right<=high){if(nums[left]>nums[right]) {tempnums[i]=nums[left];tempindex[i]=index[left];count[index[left]]+=(high-right+1);i++;left++;}else{tempindex[i]=index[right];tempnums[i]=nums[right];i++;right++;}}while(left<=mid){tempnums[i]=nums[left];tempindex[i]=index[left];i++;left++;}while(right<=high){tempindex[i]=index[right];tempnums[i]=nums[right];i++;right++;}for(int j=0;j<i;j++){nums[j+low]=tempnums[j];index[j+low]=tempindex[j];}}void mergesort(vector<int>&nums,int low,int high){if(low>=high) return ;int mid=(low+high)>>1;mergesort(nums,low,mid);mergesort(nums,mid+1,high);merge(nums,low,high,mid);}
};

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

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

相关文章

(四)数据检索与增强生成——让对话系统更智能、更高效

上一篇&#xff1a;&#xff08;三&#xff09;链式工作流构建——打造智能对话的强大引擎 在前三个阶段&#xff0c;我们已经搭建了一个基础的智能对话&#xff0c;并深入探讨了输入输出处理和链式工作流构建的细节。今天&#xff0c;我们将进入智能对话系统的高级阶段——数…

JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)

这里写目录标题 JVM虚拟机篇&#xff08;二&#xff09;&#xff1a;深入剖析Java与元空间&#xff08;MetaSpace&#xff09;一、引言二、全面认识Java2.1 Java的起源与发展历程2.2 Java的特性2.2.1 简单性2.2.2 面向对象2.2.3 平台无关性2.2.4 健壮性2.2.5 安全性2.2.6 多线程…

如何查看 MySQL 的磁盘空间使用情况:从表级到数据库级的分析

在日常数据库管理中&#xff0c;了解每张表和每个数据库占用了多少磁盘空间是非常关键的。这不仅有助于我们监控数据增长&#xff0c;还能为性能优化提供依据。 Google Gemini中国版调用Google Gemini API&#xff0c;中国大陆优化&#xff0c;完全免费&#xff01;https://ge…

[Windows] XHS-Downloader V2.4 | 小红书无水印下载工具 支持多平台批量采集

[Windows] XHS-Downloader 链接&#xff1a;https://pan.xunlei.com/s/VON4ygFN1JcyzLJJIOqIpqodA1?pwdsinu# XHS-Downloader 是一款开源免费的小红书内容下载工具&#xff0c;支持无水印视频 / 图文提取、多链接批量处理及账号作品采集。其核心优势包括&#xff1a; 全平台…

6.1 宽度优先搜索算法(BFS)

宽度优先搜索算法(BFS Breadth first search) 又称广度优先搜索&#xff0c;这种搜索是逐层的&#xff0c;搜索完上层&#xff0c;才会搜索下一层&#xff0c;直到找到目标节点。 搜索过程如图中箭头方向&#xff1a; 【例如】 八数码难题&#xff1a;利用空格的移动&#xff…

基于LSTM的文本分类2——文本数据处理

前言 由于计算机无法认识到文字内容&#xff0c;因此在训练模型时需要将文字映射到计算机能够识别的编码内容。 映射的流程如下&#xff1a; 首先将文字内容按照词表映射到成唯一的数字ID。比如“我爱中国”&#xff0c;将“中”映射为1&#xff0c;将“国”映射到2。再将文…

Redis数据结构之ZSet

目录 1.概述2.常见操作2.1 ZADD2.2 ZRANGE2.3 ZREVRANGE2.4 ZRANGEBYSCORE2.5 ZSCORE2.6 ZCARD2.6 ZREM2.7 ZINCRBY2.8 ZCOUNT2.9 ZMPOP2.10 ZRANK2.11 ZREVRANK 3.总结 1.概述 ZSet和Set一样也是String类型元素的集合&#xff0c;且不允许重复的成员&#xff0c;不同的是ZSet…

什么是DHCP服务,在生活中的应用是什么?

提起DHCP&#xff0c;不接触互联网的可能会很陌生&#xff0c;其实并没有这么高深&#xff0c;简明扼要的说就是可以自动为连接的设备分配IP地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;dns等网络参数。使连接步骤简化&#xff0c;从而提高效率。 主要功能&#xff…

2025 AI智能数字农业研讨会在苏州启幕,科技助农与数据兴业成焦点

4月2日&#xff0c;以"科技助农数据兴业”为主题的2025AI智能数字农业研讨会在苏州国际博览中心盛大启幕。本次盛会吸引了来自全国各地相关部门领导、知名专家学者、行业协会组织&#xff0c;以及县级市农业企业代表、县级市农产品销售商等万名嘉宾齐聚姑苏城&#xff0c;…

论文导读 | SOSP23 | Gemini:大模型 内存CheckPoint 快速故障恢复

本期分享的是一篇SOSP 2023论文&#xff1a; Gemini: Fast Failure Recovery in Distributed Training with In-Memory Checkpoints Zhuang Wang (Rice University), Zhen Jia (Amazon Web Services, Inc.), Shuai Zheng (Amazon Web Services), Zhen Zhang (Amazon Web Servic…

wordpress可视化数据采集Scrapes插件,WP博客网站自动采集发布

源码介绍 wordpress自动采集Scrapes插件&#xff0c;支持ripro&#xff0c;modown&#xff0c;子比&#xff0c;7b2等多种WordPress主题 支持PHP7.4&#xff0c;PHP8.0及以上不支持 上传插件到wp-content/plugins目录&#xff0c;然后解压 不需要写采集规则&#xff0c;傻瓜式…

JavaScript Math(算数)指南

JavaScript Math&#xff08;算数&#xff09;指南 引言 JavaScript的Math对象是一个内置对象&#xff0c;提供了进行数学运算的方法和值。它对于执行基本的数学计算、生成随机数以及执行更复杂的数学操作非常有用。本文将详细介绍JavaScript中的Math对象&#xff0c;涵盖其常…

Deep Reinforcement Learning for Robotics翻译解读

a. 机器人能力 1 单机器人能力&#xff08;Single-robot competencies&#xff09; 运动能力&#xff08;Mobility&#xff09; 行走&#xff08;Locomotion&#xff09;导航&#xff08;Navigation&#xff09; 操作能力&#xff08;Manipulation&#xff09; 静态操作&…

最新扣子(Coze)案例教程:最新抖音视频文案提取方法替代方案,音频视频提取文案插件制作,手把手教学,完全免费教程

&#x1f468;‍&#x1f4bb; 星球群同学反馈&#xff0c;扣子平台的视频提取插件已下架&#xff0c;很多智能体及工作流不能使用&#xff0c;斜杠君这里研究了一个替代方案分享给大家。 方案原理&#xff1a;无论是任何视频或音频转文案&#xff0c;我们提取的方式首先都是要…

yum list查询时部分包查找不到流程分析

以下是针对 yum list available -c xxx.repo&#xff08;对应 DNF 的命令行操作&#xff09;的详细流程解读&#xff0c;包括参数解析、配置初始化、元数据加载、数据库查询&#xff0c;以及读取不到特定包的场景分析。 1. 命令行参数解析与入口函数 代码入口: dnf.cli.main.m…

k8s 1.23升级1.24

0、简介 这里只用3台服务器来做一个简单的集群&#xff0c;当前版本是1.23.17目标升级到1.24.17 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 我这里设置的master2可调度pod&#xff0c;将master2的污点去掉 kubectl de…

# 实时人脸识别系统:基于 OpenCV 和 Python 的实现

实时人脸识别系统&#xff1a;基于 OpenCV 和 Python 的实现 在当今数字化时代&#xff0c;人脸识别技术已经广泛应用于各种场景&#xff0c;从手机解锁到安防监控&#xff0c;再到智能门禁系统。今天&#xff0c;我将通过一个完整的代码示例&#xff0c;详细讲解如何使用 Pyt…

Linux:(五种IO模型)

目录 一、对IO的重新认识 二、IO的五种模型 1.阻塞IO 2.非阻塞IO 3.信号驱动IO 4.IO多路转接 5.异步IO 6.一些概念的解释 三、非阻塞IO的代码实现 1.fcntl 2.实现主程序 一、对IO的重新认识 如果有人问你IO是什么&#xff0c;你该怎么回答呢&#xff1f; 你可能会说…

将电脑控制手机编写为MCP server

文章目录 电脑控制手机后,截屏代码复习MCP server构建修改MCP的config文件测试效果困惑电脑控制手机后,截屏代码复习 def capture_window(hwnd: int, filename: str = None) -> dict:""&

[ctfshow web入门] web6

前置知识 入口点(目录)爆破 还记得之前说过网站的入口的吗&#xff0c;我们输入url/xxx&#xff0c;其中如果url/xxx存在&#xff0c;那么访问成功&#xff0c;证明存在这样一个入口点&#xff1b;如果访问失败则证明不存在此入口点。所以我们可以通过遍历url/xxx&#xff0c;…