Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:
Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.
Each input file contains one test case, which gives a positive N (≤105) followed by a permutation sequence of {0, 1, ..., N−1}. All the numbers in a line are separated by a space.
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
10
3 5 7 2 6 4 9 0 8 1
9
题目给出一组已经打乱排序的数组,让你只能交换值为0和其他的数字,使得最终排序为升序,要求输出最少的交换次数。
1. 首先我们要明确,值为0的数,无论怎么交换,最终都会出现在数组下标为0的位置上。所以我们第一步就是从数组下标为0的位置开始交换,因为是两两交换,每次都会使得至少一个位置上的数字正确,所以肯定能把0放到下标为0的位置上:
while(number[0]!=0){
swap(number[0],number[number[0]]);
times++;
} // 使得number[0]位置上的数字可以出现在正确的位置上
2. 如果此时,依旧没有使得number[i]位置上的数字正确,那么就将0放到number[i]上,在第二次使0归为的途中,number[i]就一定会出现一个正确的数字了。
- #include
- using namespace std;
-
- int main(){
- int N;
- cin>>N;
- int number[N];
- int times = 0;
- for(int i=0;i
- cin>>number[i];
- }
-
- for(int i=1;i
- if(number[i] != i){
- while(number[0]!=0){
- swap(number[0],number[number[0]]);
- times++;
- }
- if(number[i]!=i){
- swap(number[0],number[i]);
- times++;
- }
- }
-
- }
- cout<
- }
-
相关阅读:
智慧交通与车载数据的聚合路由器通信方案
搭建oss服务器时报错:java.lang.NullPointerException
速卖通:按关键字搜索商品 API
让软件开发民主化的低代码
联通面试题
高性能日志脱敏组件:已支持 log4j2 和 logback 插件
Qt Socket 通讯示例2
# Spring MVC与RESTful API:如何设计高效的Web接口
复习mysql中的事务
python读取txt格式的点云文件,可视化显示,保存ply格式
-
原文地址:https://blog.csdn.net/weixin_55202895/article/details/126866128