leetcode算法之分治-归并

news2024/10/6 2:28:33

目录

  • 1.排序数组
  • 2.数组中的逆序对
  • 3.计算右侧小于当前元素的个数
  • 4.翻转对

1.排序数组

排序数组
在这里插入图片描述

//分治-归并
class Solution {
    int tmp[50010];
public:
    vector<int> sortArray(vector<int>& nums) {
        mergeSort(nums,0,nums.size()-1);
        return nums;
    }

    void mergeSort(vector<int>& nums,int left,int right)
    {
        if(left>=right) return;
        //1.选择中间点划分区间
        int mid = (left+right)>>1;
        //[left,mid][mid+1,right]
        //2.将左右两区间排序
        mergeSort(nums,left,mid);
        mergeSort(nums,mid+1,right);
        //3.合并两个有序数组
        int cur1 = left,cur2 = mid+1,i=0;
        while(cur1<=mid && cur2<=right)
        {
            tmp[i++] = nums[cur1]>=nums[cur2]?nums[cur2++]:nums[cur1++];
        }
        while(cur1<=mid) tmp[i++] = nums[cur1++];
        while(cur2<=right) tmp[i++] = nums[cur2++];
        //还原
        for(int j=left;j<=right;j++)
        {
            nums[j] = tmp[j-left];
        }
    }
};

2.数组中的逆序对

数组中的逆序对
在这里插入图片描述

class Solution {
    int tmp[50010];
public:
    int reversePairs(vector<int>& nums) {
        return mergeSort(nums,0,nums.size()-1);
    }

    int mergeSort(vector<int>& nums,int left,int right)
    {
        if(left>=right) return 0;
        int ret = 0;
        //1.选择中间元素划分区间
        int mid = (left+right)>>1;
        //[left,mid][mid+1,right]
        //2.计算左右区间的逆序对的个数
        ret += mergeSort(nums,left,mid);
        ret += mergeSort(nums,mid+1,right);
        //3.计算一左一右逆序对的个数+合并两个有序数组
        int cur1 = left,cur2 = mid+1,i=0;
        while(cur1<=mid&& cur2<=right)//升序
        {
            if(nums[cur1]<=nums[cur2]) tmp[i++] = nums[cur1++];
            else
            {
                ret += mid-cur1+1;
                tmp[i++] = nums[cur2++];
            }
        }
        while(cur1<=mid) tmp[i++] = nums[cur1++];
        while(cur2<=right) tmp[i++] = nums[cur2++];
        //还原
        for(int j=left;j<=right;j++)
        {
            nums[j] = tmp[j-left];
        }

        return ret;
    }
};

3.计算右侧小于当前元素的个数

计算右侧小于当前元素的个数
在这里插入图片描述

class Solution {
    vector<int> ret;
    vector<int> index;//记录nums当前元素的原始下标

    int tmpNums[500010];
    int tmpIndex[500010];
public:
    vector<int> countSmaller(vector<int>& nums) {
        //计算当前元素之后,有多少个比我小(降序)
        int n = nums.size();
        ret.resize(n);
        index.resize(n);
        //初始化index数组
        for(int i=0;i<n;i++)
        {
            index[i] = i;
        }
        mergeSort(nums,0,n-1);
        return ret;
    }

    void mergeSort(vector<int>& nums,int left,int right)
    {
        if(left>=right) return;
        //1.选择中间元素划分区间
        int mid = (left+right)>>1;
        //[left,mid][mid+1,right]
        //2.将左右区间进行排序
        mergeSort(nums,left,mid);
        mergeSort(nums,mid+1,right);
        //3.处理一左一右的情况
        int cur1 = left,cur2 = mid+1,i=0;
        while(cur1<=mid&& cur2<=right)//降序
        {
            if(nums[cur1]<=nums[cur2])
            {
                tmpNums[i] = nums[cur2];
                tmpIndex[i++] = index[cur2++];
            }
            else
            {
                ret[index[cur1]] += right-cur2+1;
                tmpNums[i] = nums[cur1];
                tmpIndex[i++] = index[cur1++];
            }
        }
        while(cur1<=mid) 
        {
            tmpNums[i] = nums[cur1];
            tmpIndex[i++] = index[cur1++];
        }
        while(cur2<=right)
        {
            tmpNums[i] = nums[cur2];
            tmpIndex[i++] = index[cur2++];
        }
        //还原
        for(int j=left;j<=right;j++)
        {
            nums[j] = tmpNums[j-left];
            index[j] = tmpIndex[j-left];
        }
    }
};

4.翻转对

翻转对
在这里插入图片描述

//计算当前元素之前,有多少元素的一半比我大--升序
class Solution {
    int tmp[50010];
public:
    int reversePairs(vector<int>& nums) {
      return mergeSort(nums,0,nums.size()-1);  
    }

    int mergeSort(vector<int>& nums,int left,int right)
    {
        if(left>=right) return 0;
        int ret = 0;
        //1.选择中间元素划分区间
        int mid = (left+right)>>1;
        //[left,mid][mid+1,right]
        //2.计算左右区间翻转对的个数
        ret += mergeSort(nums,left,mid);
        ret += mergeSort(nums,mid+1,right);
        //3.先计算翻转对的个数
        int cur1 = left,cur2 = mid+1,i=0;
        while(cur2<=right)//升序的情况
        {
            while(cur1<=mid && nums[cur1]/2.0<=nums[cur2]) cur1++;
            if(cur1 > mid) 
                break;
            ret += mid-cur1+1;
            cur2++;
        }
        //4.合并两个有序数组
        cur1 = left,cur2 = mid+1;
        while(cur1<=mid && cur2<=right)//升序
        {
            tmp[i++] = nums[cur1]<=nums[cur2]?nums[cur1++]:nums[cur2++];
        }
        while(cur1<=mid) tmp[i++] = nums[cur1++];
        while(cur2<=right) tmp[i++] = nums[cur2++];
        //还原
        for(int j=left;j<=right;j++)
        {
            nums[j] = tmp[j-left];
        }
        return ret;
    }
};
//计算当前元素后面,有多少元素的两倍比我小--降序
class Solution {
    int tmp[50010];
public:
    int reversePairs(vector<int>& nums) {
      return mergeSort(nums,0,nums.size()-1);  
    }

    int mergeSort(vector<int>& nums,int left,int right)
    {
        if(left>=right) return 0;
        int ret = 0;
        //1.选择中间元素划分区间
        int mid = (left+right)>>1;
        //[left,mid][mid+1,right]
        //2.计算左右区间翻转对的个数
        ret += mergeSort(nums,left,mid);
        ret += mergeSort(nums,mid+1,right);
        //3.先计算翻转对的个数
        int cur1 = left,cur2 = mid+1,i=0;
        while(cur1<=mid)//降序的情况
        {
            while(cur2<=right && nums[cur1]/2.0<=nums[cur2]) cur2++;
            if(cur2 > right) 
                break;
            ret +=right-cur2+1;
            cur1++;
        }
        //4.合并两个有序数组
        cur1 = left,cur2 = mid+1;
        while(cur1<=mid && cur2<=right)//降序
        {
            tmp[i++] = nums[cur1]<=nums[cur2]?nums[cur2++]:nums[cur1++];
        }
        while(cur1<=mid) tmp[i++] = nums[cur1++];
        while(cur2<=right) tmp[i++] = nums[cur2++];
        //还原
        for(int j=left;j<=right;j++)
        {
            nums[j] = tmp[j-left];
        }
        return ret;
    }
};

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

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

相关文章

Java核心知识点整理大全7-笔记

目录 4.1.9. JAVA 锁 4.1.9.1. 乐观锁 4.1.9.2. 悲观锁 4.1.9.3. 自旋锁 4.1.9.4. Synchronized 同步锁 Synchronized 作用范围 Synchronized 核心组件 Synchronized 实现 4.1.9.5. ReentrantLock Lock 接口的主要方法 非公平锁 公平锁 ReentrantLock 与 synchronized …

[⑤ADRV902x]: TES (Transceiver Evaluation Software) 使用

前言 在ADI官网的ADRV902x系列的参考设计软件包&#xff08;地址&#xff1a;https://www.analog.com/cn/products/adrv9029.html#product-requirement &#xff09;中包含了GUI软件TES (Transceiver Evaluation Software)。软件实用的功能非常多&#xff0c;比如可以用界面的…

【C++上层应用】6. 信号 / 中断

文章目录 【 1. signal 函数 】【 2. raise函数 】 信号是由操作系统传给进程的 中断&#xff0c;会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上&#xff0c;可以通过按 CtrlC 产生中断。有些信号不能被程序捕获&#xff0c;但是下表所列信号可以在程序中捕…

山西电力市场日前价格预测【2023-11-22】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-22&#xff09;山西电力市场全天平均日前电价为13.55元/MWh。其中&#xff0c;最高日前电价为243.27元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出现…

安卓毕业设计:基于安卓android微信小程序的便捷记账本系

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

4本期刊被踢!11月SCI/SSCI目录已更新

​2023年11月20日&#xff0c;科睿唯安更新了Web of Science核心期刊目录。 此次更新后SCIE期刊目录共包含9481本期刊&#xff0c;SSCI期刊目录共包含3551本期刊。此次SCIE & SSCI期刊目录更新&#xff0c;与上次更新&#xff08;2023年10月&#xff09;相比&#xff0c;共…

学习教授LLM逻辑推理11.19

学习教授LLM逻辑推理 摘要1 引言2前言2.1事件关系提取2.2 演绎推理 3 揭示逻辑推理中的LLMS3.1 LLM如何执行任务3.1.1数据源3.1.2实验装置3.1.3 分析 3.2 LLM如何执行抽象多跳推理&#xff1f;3.2.1数据来源3.2.2 实验装置。3.2.3 分析。 4 逻辑推理教学4.1 LLM的上下文学习4.2…

【unity3D-网格编程】01:Mesh基础属性以及用代码创建一个三角形

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的网格编程方面学习笔记 &#x1f236;本篇是unity的网格编程系列01-mesh基础属性 网格编程系列01 mesh基础属性实践操作用代码初始化一个三角形在三角形的基础上改成正…

小众市场:探索跨境电商中的利基领域

随着全球数字化和互联网的普及&#xff0c;跨境电子商务已经成为了一个蓬勃发展的产业。从亚马逊到阿里巴巴&#xff0c;大型电商平台已经占据了很大一部分市场份额。 然而&#xff0c;在这个竞争激烈的领域&#xff0c;寻找小众市场和利基领域可能是一种成功的策略。本文将探…

电脑显示找不到mfc140.dll怎么办?哪个修复方法值得推荐

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;例如"mfc140.dll文件缺失"这个问题可能会导致某些应用程序无法正常运行&#xff0c;可能给您带来困扰。本篇文章为您提供了六种有效解决此类问题的策略&#xff0c;使您能够迅速修复并恢复应用程…

Linux fork和vfork函数用法

fork和vfork是用于创建新进程的函数&#xff0c;在Linux的C语言编程中非常常见。 fork函数 fork函数是用于创建一个新的进程&#xff0c;新进程是调用进程的副本。新进程将包含调用进程的地址空间、文件描述符、栈和数据。在fork之后&#xff0c;父进程和子进程将并发执行。 …

被开除的ChatGPT之父,又回来了?

前两天&#xff0c;科技界爆出一个惊天大瓜&#xff0c;ChatGPT的创始人兼CEO&#xff0c;山姆阿尔特曼被自己的公司给开除了&#xff1a; 突发&#xff01;ChatGPT之父被开除&#xff01; 这条新闻一出来&#xff0c;整个科技界都炸锅了&#xff0c;有些幽默网友为了调侃这件事…

Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案

Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案 也是昨天晚上折腾了一个晚上到凌晨四点多,实在没有头绪,在论坛,贴吧,各种求助查贴,没有什么人解决.后面请教了一个安全圈的大佬朋友给解决了. 我的问题是在kali上的,所以只写了kali 的解决方案: 修改插件: vim /opt/…

小型洗衣机什么牌子好又便宜?性价比迷你洗衣机推荐

相信大家都知道&#xff0c;我们的内衣、内裤等贴身的衣物是不能和其它衣服直接放进大型洗衣机里洗的&#xff0c;每一次清洗都要把内衣一件件挑出来&#xff0c;然后再用手去洗&#xff0c;而我们每天都要上厕所&#xff0c;不可避免地会沾染上一些污垢和细菌&#xff0c;用手…

public private protected区别

北风胡乱刮着&#xff0c;我只想关上窗&#xff0c;煮着茶&#xff0c;在扑哧扑哧的白烟里心安理得地懒着。像郁达夫说得那样&#xff1a;“躲在屋里过活的两三个月的生活&#xff0c;却是一年之中最有劲的一段蛰居异境。”不管门外如何变幻莫测&#xff0c;围炉煮茶&#xff0…

2024专业的数据恢复软件EasyRecovery16

当我们处理重要的文件数据时&#xff0c;遇到突然停电导致数据来不及保存&#xff0c;再次打开电脑后&#xff0c;此前处理的数据可能丢失&#xff0c;这无疑会影响我们的工作进度&#xff0c;数据恢复软件在此时就派上用场&#xff0c;那么下面就来具体介绍EasyRecovery软件的…

【GUI】-- 11 贪吃蛇小游戏之绘制静态的小蛇

GUI编程 04 贪吃蛇小游戏 4.2 第二步&#xff1a;绘制静态的小蛇 现在绘制静态的小蛇(即小蛇初始位置)&#xff0c;并且完善游戏默认初始状态。这一步还在GamePanel类中实现。 首先&#xff0c;定义了小蛇的数据结构&#xff0c; //定义蛇的数据结构int length; //小蛇总长…

代码随想录算法训练营第23期day52|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

目录 一、300.最长递增子序列 二、674. 最长连续递增序列 三、718. 最长重复子数组 一、300.最长递增子序列 力扣题目链接 子序列是可以在不改变原有次序的情况下删除一些元素&#xff0c;需要进行二重遍历进行判断 class Solution { public:int lengthOfLIS(vector<in…

uniapp+vue3使用pinia,安卓端报错白屏

报错内容&#xff1a; reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->at useStore2 (app-service.js:1487:15)at (app-service.js:1714:17)at (app-serv…

spring boot加mybatis puls实现,在新增/修改时,对某些字段进行处理,使用的@TableField()或者AOP @Before

1.先说场景&#xff0c;在对mysql数据库表数据插入或者更新时都得记录时间和用户id 传统实现有点繁琐&#xff0c;这里还可以封装一下公共方法。 2.解决方法&#xff1a; 2.1&#xff1a;使用aop切面编程&#xff08;记录一下&#xff0c;有时间再攻克&#xff09;。 2.1.1&am…