求最小交换次数

秋招每日一题T25——最少交换次数 给定一个 1∼N 的随机排列,要求一次只能交换相邻两个数,那么最少需要交换多少次才可以使数列按照从小到大排列呢?请你求出一个待排序序列的最少交换次数和对应的逆序数列。逆序数列:给定 n 个数 1,2,…,n 的一个排列 a1a2…an,令 bi 是数 i 在此排列中的逆序数,换句话说,bi 等于该排列中先于 i 又大于 i 的那些数的个数。数列 b1b2…bn 称为排列 a1a2…an 的逆序数列(inversion sequence)。第一行一个整数 N。第二行一个 1∼N 的排列。... 阅读详情

求最小交换次数

  1. 相邻交换
  2. 任意交换

相邻交换:(求逆序对数)

  1. 归并排序
void msort(vector<int> &a, int l, int r) {
    if (l == r) {
        return;
    }
    int m = (l + r) >> 1;
    msort(a, l, m);
    msort(a, m + 1, r);
    tmp.clear();
    for (int i = l, j = m + 1; i <= m || j <= r;) {
        if (i <= m && j <= r) {
            if (a[i] <= a[j]) {
                tmp.push_back(a[i]);
                i++;
            } else {
                tmp.push_back(a[j]);
                j++;
                res += (m - i + 1); //
            }
        } else if (i <= m) {
            tmp.push_back(a[i]);
            i++;
        } else {
            tmp.push_back(a[j]);
            j++;
        }
    }
    for (int i = 0; i < tmp.size(); i++) {
        a[l + i] = tmp[i];
    }
}
  1. 树状数组
#include<bits/stdc++.h>
#define M 500005
using namespace std;
int a[M],d[M],t[M],n;
int lowbit(int x)
{
	return x&-x;
}
int add(int x)//把包含这个数的结点都更新 
{
	while(x<=n)//范围 
	{
		t[x]++;
		x+=lowbit(x);
	}
}
int sum(int x)//查询1~X有几个数加进去了 
{
	int res=0;
	while(x>=1)
	{	
		res+=t[x];
		x-=lowbit(x);
	}
	return res;
}
bool cmp(int x,int y)//离散化比较函数 
{
	if(a[x]==a[y]) return x>y;//避免元素相同 
	return a[x]>a[y];//按照原序列第几大排列 
}
int main()//402002139
{
	//freopen("in.txt","r",stdin);
	long long ans=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i],d[i]=i;
	sort(d+1,d+n+1,cmp);//离散化 
	for(int i=1;i<=n;i++)
	{
		add(d[i]);//把这个数放进去 
		ans+=sum(d[i]-1);//累加 
	}
	cout<<ans;
	return 0;
}

任意交换:(求置换环数)

  • 离散化+ (找环/并查集)
int judge(vector<int> &a) {
        int n = a.size();
        vector<int> b = a;
        sort(b.begin(), b.end());
        for (int i = 0; i < n; i++) {
            a[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin();
        }
        int res = n;
        vector<bool> vis(n);
        for (int i = 0; i < n; i++) {
            if (vis[i]) continue;
            int j = i;
            while (!vis[j]) {
                vis[j] = 1;
                j = a[j];
            }
            res--;
        }
        return res;
    }
关于一个求最小交换次数的算法的一个严格证明,是严格证明,不是想当然 问题描述: 有一个1~n的数列的排列,但是这个数列已经被打乱了排列顺序,如果我们只是通过“交换任意两个元素”,那么,要实现元素从1~n的有序排列,“最少的交换次数是多少?” 解答过程: 首先我们纸上可以先写写简单的情况试试,比如排列:4 3 1 2, 交换次数=3;我们可以在多组测试中,边测试边想,真正的实现需要满足:4本该到2处, 2本该到3处, 3本该到1处, 1本该到4处,刚好一个循环 阅读详情

相关推荐

最少交换次数 — 华为od机试真题(A卷、JavaScript题解)

给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数。 组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。

学习,你不是一个人在战斗 ~ 961302305(QQ,微信) 970

最小交换次数

每一次得交换都只能消除一对逆序对,所以最少得交换次数就是每次得交换都满足消除一对逆序对,即交换的次数就是逆序对得个数。

ajl2003的博客 980

【雷达图】R语言绘制雷达图(ggradar),NBA季后赛数据为例

一起用R语言给nba球星画球技雷达图吧!

池塘春草梦的博客 6252

将数组排序所需的最小交换次数

问题:最小交换次数 问题描述: 给出一个具有N个不同值的数组A[],找出将数组排序所需的最小交换次数。 输入: 第一行包含一个整数T,表示测试用例的数量。接下来会有T个测试用例,对于每个测试用例,包含一个整数N表示数组A[]中元素的个数,接下来一行为数组A[],包含N个用空格分开的整数。 数据规模:(1&lt;=T&lt;=100; 1&lt;=N&lt;=100; 1&lt;=A[i]&lt;=...

努力提高姿势水平 1万+

FairyGUI深度解析:Unity复杂UI开发的高效解决方案与性能优化

在Unity游戏和应用开发中,UI系统的性能与开发效率是核心挑战。原生UGUI的组件化模型在应对复杂、动态界面时,常面临Draw Call过高、层级管理臃肿的问题。其原理在于,每个UI元素对应一个GameObject,渲染合批受限于Transform层级与材质状态,易导致性能瓶颈。FairyGUI(FGUI)作为一种专业的第三方UI解决方案,其技术价值在于采用了截然不同的“舞台-显示对象”渲染模型。该模型通过内部轻量级对象管理与自主合批系统,实现了极高的运行时效率与Draw Call优化。在应用场景上,FG

weixin_31315567的博客 342

SpringBoot整合海康SDK实战:从设备初始化到PS流录像转MP4全流程(附避坑指南)

本文详细介绍了SpringBoot整合海康SDK的完整实战流程,涵盖设备初始化、通道管理、录像检索与下载。针对海康设备生成的PS流录像文件无法直接播放的痛点,重点解析了如何利用FFmpeg高效、无损地将其转换为通用的MP4格式,并提供了关键的避坑指南和性能优化建议。

chair的专栏 764

交换的最小次数

其实对于不在正确位置上的坏元素,最终都是要换掉的。可以这样想,现在把每个数组中的坏元素拿出来然后放在一起,有一个神秘人物暗中操作一下,所有数组中的元素就都是正确的了。)(也许吧,反正我一直是这么想的)来理解,的个数排序,然后首尾指两个指针,依次交换。这里要让超过平均值,和没有超过平均值的换。并且只要有一个换到平均值,就不用再换了。组成的数组,可以进行的操作为任意选择两个数组,并且两个数组中选择相同的位置进行交换,问最少交换多少次可以让所有数组中。毕竟最小就需要换这些,那只要这些能满足就是最优的了。

weixin_52205764的博客 751

Qt | linux+openCV+Qt6.5.3环境搭建成功版(带例子)

opencv安装 Qt 实战举例

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 1885

有序数组两两交换,求最小的交换次数。

1、有序数组,按照0到n – 1的序列编号,顺序打乱,请您用最小的交换操作次数,使其重新变成递增序列。假如:编号保存在一个数组array当中。一次交换操作可以将这个数组的其中两个数互换。 限制: 1 <= n <= 100000 例 1: 输入: array = [2,0,1] 输出: 2 解释: 先交换0和2(一次交换操作),再交换1和2(一次交换操作)即可。 例 2:...

Xuebing_han的博客 5354

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的危险物品检测系统(深度学习模型+PySide6界面+训练数据集+Python代码)

随着公共安全需求的日益增长,危险物品检测技术在社会安防、交通安检等领域发挥着重要作用。本文介绍了一个基于YOLO系列深度学习框架的危险物品检测系统,集成了YOLOv8、YOLOv7、YOLOv6和YOLOv5四种先进的物体检测算法。系统采用PySide6开发了用户友好的图形界面,提供了完整的训练代码、预训练模型和数据集构建方案。实验结果表明,该系统在危险物品检测任务上实现了高精度和高实时性,为实际应用提供了可靠的技术支持。

YOLO 156

SAP-RPT-1 深度解读:面向企业表格数据的 rapid one

摘要: SAP在TechEd 2025大会上推出面向企业结构化数据的SAP-RPT-1(Relational Pretrained Transformer),旨在通过in-context learning直接预测表格数据中的缺失值,无需传统机器学习流程。与LLM不同,RPT专为业务表格设计,支持实时预测(如交货延迟、回款风险等)。提供Small(高吞吐)、Large(高精度)和开源版本,用户可通过无代码Playground(上传CSV并用[PREDICT]标记目标列)或Python API快速验证。典型场景

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 236

LeetCode5749. 邻位交换的最小次数(求原串到目标串通过交换相邻两个字符的最小交换次数)

题目描述: 给你一个表示大整数的字符串 num ,和一个整数 k 。 如果某个整数是 num 中各位数字的一个 排列 且它的 值大于 num ,则称这个整数为 妙数 。可能存在很多妙数,但是只需要关注 值最小 的那些。 例如,num = "5489355142" : 第 1 个最小妙数是 "5489355214" 第 2 个最小妙数是 "5489355241" 第 3 个最小妙数是 "5489355412" 第 4 个最小妙数是 "5489355421" 返回要得到第 k 个 最小妙数 需要对 num

gh6267的博客 1908

【VS开发】【DSP开发】WinDriver简介(或介绍)

WinDriver for Windows简化并自动化了用户模式Windows设备驱动程序的开发,支持设备包括PCI / CardBus / ISA/ PCI-104 / PCMCIA * / PMC / PCI-X 和 CompactPCI,无需DDK或内核级编程知识。关于USB设备驱动开发,请参见WinDriver USB for Windows。   WinDriver包含一系列

ZhangPY的专栏 1477

数组排序求最小交换次数

一道很经典的题目了,本质上是个图论问题。我们可以遍历数组,对于每个元素,我们将该元素和它正确的位置建边,最后一定是 1 ∼ n 个环(自环也算)。对于有 k 个元素的环,最少交换次数为 k−1。假设共有 p 个环,对于第 i 个环,有 ki​ 个元素,则它的最少交换次数为 ki​−1。因此答案为 ∑i=1p​(ki​−1)=n−p,即元素个数减去环的个数。题意:给定长度为n的数组,每次可以任意交换两个元素,求将数组变为升序的最小交换次数。对于环的判断,运用dfs即可。

Unlimitedz的博客 1334

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

排序中求最小交换次数

有两种: 1只能相邻位置交换 2任意位置交换 第1种,好像是求逆序数 第2种,我觉得是选择排序的交换次数,但没有证明 转载于:https://www.cnblogs.com/wmxl/p/5349606.html...

weixin_30632899的博客 527

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

求最小交换次数(求逆序对)

经过5h激烈的比拼,2021ICPCECF终于接近尾声!闭幕式上,主办方决定给幸苦的自己颁一个“最顽强拼搏奖”!包括隆今惠在内的若干名馊瀑公司代表上台领奖!

huhubbdd的博客 735

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2015笔试上机题-- 求01串的最小交换次数

题目描述: 给定一个01串(仅由 ‘0’或‘1’组成的字符串),现在把这个数字串排序成“非递减系列”,请问至少需要多少次交换(任意两个位置交换)? Input 输入数据第一行是一个正整数T(T 接下来的T行,每行给出一个01串。 数据包装—— 50%的字符串长度在[1,100]之间; 95%的字符串长度在[1,10000]; 100%的字符串长度在[1,1000

bu_min的博客 3425

【蓝桥杯】求冒泡排序交换次数为100的最小字符串

求冒泡排序交换次数为100的最小字符串 题目:在冒泡排序中,每次只能交换相邻的两个元素。 小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。 例如,对于字符串lan排序,只需要1次交换。对于字符串qiao排序,总共需要4次交换。 小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要100次交换,可是他忘了把这个字符串记下来,现在找不到了。 请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要1

木又可可的博客 612

将链表所有目标字符聚在一起,求最小交换次数 (由Leetcode 1151想到的)

题目描述: 将一个链表通过交换节点位置的操作使链表中的value为k的节点都聚集在一起,给出最少需要的交换次数。 输入描述: 第一行为链表的长度,取值范围为1~1000 第二行为链表的节点,如 1 2 3 代表1->2->3,每个节点value为整数,取值范围0~10000 第三行为k 输出描述: 输出需要的最少交换次数 例子: 输入: 5 1 2 1 2 1 2 输出: 1 解法: 这道题其实链表和数组是一样的,所以直接用数组来存即可。 一开始的思路是,找出这个数

Stupid_human的博客 619

圆桌会议 (一个环,求交换相邻两个人的位置,求最小的交换次数)

HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一般没有解决不了的问题,这也只有HDU ACM集训队特有的圆桌会议,有一天你也可以进来体会一下哦:),在一天在讨论的时候,Eddy想出了一个极为古怪的想法,如果他们在每一分钟内,一对相邻的两个ACM队员交换一下位子,那么要多少时间才能得到与原...

自渡的博客 2605

Ultra-QuickSort 求最小交换次数即求逆序对数 树状数组+离散化

首先介绍一下树状数组 树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,怎样才能快速地获取连续几个数的和? 传统数组(共n个元素)的元素修改和连续元素求和的复杂度分别为O(1)和O(n)。树状数组通过将线性结构转换成伪树状结构(线性结构只能逐个扫描元素

wjlwangluo的博客 838

[蓝桥杯]交换次数

根据当前分组顺序,将字符串分为三段,每段对应一个字母。

qq_2937655951的博客 978

排序最小交换代价

CSL的魔法 How to sort

越看越喜欢啊 2067

C语言简单算法之数组中偶数的和,输出小于均值的数,将数组中的数逆序存放, 求最大值及其下标,交换最小值和最大值,选择法排序,求矩阵各行元素之和,方阵左下三角元素的和,求整数序列中出现次数最多的数

##【1】 ##题目一 数组中偶数的和 1.实验代码 #include&lt;stdio.h&gt; int main() { int i,sum=0; int a[10]; for(i=0;i&lt;10,i++) { scanf("%d",&amp;a[i]); if(a[i]%2==0){ sum=sum+a[i];} } printf("s=...

low666的博客 9802
上一篇: 7-3 哈夫曼树与哈夫曼编码
下一篇: FFT NTT模板
liamaking
博客等级 码龄7年 97粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值