当前位置: 首页 > ai >正文

力扣周赛置换环的应用,最少交换次数

置换环的基本概念

置换环是排列组合中的一个概念,用于描述数组元素的重排过程。当我们需要将一个数组转换为另一个数组时,可以把这个转换过程分解为若干个 “环”。每个环代表一组元素的循环交换路径。

举个简单例子

假设原数组 A = [3, 2, 1, 4],目标数组 B = [1, 2, 3, 4](即按升序排序)。
我们需要将 A 转换为 B,可以通过以下步骤分析:

确定每个元素的目标位置:

        1.原数组 A[0]=3,在目标数组 B 中应该位于索引 2(值为 3 的位置。

        2.原数组 A[2]=1,在目标数组 B 中应该位于索引 0(值为 1 的位置。

        3.这形成了一个环:索引 0 → 索引 2 → 索引 0,对应的值为 3 → 1 → 3

其他元素

原数组 A[1]=2 和 A[3]=4 已经在正确位置,各自形成长度为 1 的环

环的结构
环1:0 → 2 → 0 (长度2)
环2:1 → 1 (长度1)
环3:3 → 3 (长度1)

重要结论

将一个环排序所需的最小交换次数 = 环的长度 - 1。

最少总交换次数 = 总元素数 - 环的数量

来看一道字节跳动的力扣周赛

int getSum(int x){int ret=0;while(x){ret=ret+x%10;x/=10;}return ret;}
bool comp(const pair<int,int>&p1,const pair<int,int>& p2){int num1=getSum(p1.first);int num2=getSum(p2.first);if(num1==num2){return p1.first<p2.first;}else{return num1<num2;}
}
class Solution {
public:int minSwaps(vector<int>& nums) {int len=nums.size();vector<pair<int,int>> arr;for(int i=0;i<len;i++){arr.push_back({nums[i],i});}sort(arr.begin(),arr.end(),comp);vector<int> table(nums.size());for(int i=0;i<arr.size();i++){table[arr[i].second]=i;}vector<bool> visited(len,false);int circles=0;for(int i=0;i<len;i++){if(!visited[i]){int cur=i;circles++;while(!visited[cur]){visited[cur]=true;cur=table[cur];}}}return len-circles;//元素总数-环的数量}
};

http://www.xdnf.cn/news/7783.html

相关文章:

  • 高阶数据结构——红黑树实现
  • CentOS:搭建国内软件repository,以实现自动yum网络安装
  • Windows逆向工程提升之IMAGE_FILE_HEADER
  • 【Linux笔记】防火墙firewall与相关实验(iptables、firewall-cmd、firewalld)
  • 健康监测实训室建设方案构建
  • 每日代码解读专栏:OpenVLA(Action)部分的解读
  • 从机械应答到深度交互,移远通信如何让机器人“灵魂觉醒”?
  • spring中的Interceptor使用说明
  • 静态方法和实例方法的区别
  • Java枚举详解
  • PromptIDE:一款强大的AI提示词优化工具
  • CYT4BB Dual Bank - 安全启动
  • jenkins使用Send build artifacts over SSH发布jar包目录配置
  • 软件设计师“排序算法”真题考点分析——求三连
  • 002-类和对象(一)
  • (八)深度学习---计算机视觉基础
  • 信息系统项目管理师考前练习4
  • 深入理解 Pre-LayerNorm :让 Transformer 训练更稳
  • Day123 | 灵神 | 二叉树 | 找树左下角的值
  • Vue3中插槽, pinia的安装和使用(超详细教程)
  • 物联网之使用Vertx实现UDP最佳实践【响应式】
  • DataOutputStream DataInputStream转换流
  • I.MX6U Mini开发板测试GPIO
  • Linux中进程控制(上)
  • 【Rust智能指针】Rust智能指针原理剖析与应用指导
  • C++初阶-vector的模拟实现3
  • vue原生table表格实现动态添加列,一行添加完换行继续添加。el-select输入框背景颜色根据所选内容不同而改变
  • BeamDojo: Learning Agile Humanoid Locomotion on Sparse Footholds
  • 如果教材这样讲--单片机IO口Additional Functions和 Alternate Functions的区别
  • 基于Android的XX校园交流APP