pongo题解之数组排序

来源:互联网 发布:java web开发面试宝典 编辑:程序博客网 时间:2024/06/15 06:27

本来3星15分的题,结果头天晚上没想出来,今天早上好好想了下,一次搞定,但是发现是2星10分了,唉~~第2次遇到这样的事,看来以后还是早点想方法。

首先还是说下题目:

本题来自caopengcs(向大牛致敬!),只要你有兴趣,每个人都可以出题(出题入口在主页右侧边栏“贡献题目”内),以下是题目详情:

给定一个包含1-n的数列,我们通过交换任意两个元素给数列重新排序。求最少需要多少次交换,能把数组排成按1-n递增的顺序,其中,数组长度不超过100。

例如:

原数组是3,2,1, 我们只需要交换1和3就行了,交换次数为1,所以输出1。

原数组是2,3,1,我们需要交换2和1,变成1,3,2,再交换3和2,变为1,2,3,总共需要的交换次数为2,所以输出2。

函数头部:

C/C++

int run(const int *a,int n);

java

class solution {

public static int run(int [] a)

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

我昨天晚上一开始想到的是通过选择排序实现,但是发现选择排序不好解决此处的“最少”问题(也许可以,但是我没通过这种方法做出来),今天早上的想法也分了两个阶段,

第二个阶段是在第一个阶段的基础上稍微做了下调整,整体的想法是寻找数组中出现的环。

我开始是这样想的:N个数,其中有n个数的位置不正确,那么最多需要n-1次调整,但是我这时老是纠结在怎样拼凑出最多的互调调整(就是通过调整某个数,达到另外两个能一次交换实现,因为我认为互调才能节省调整次数),但是后来发现互调不就是长度为2的环嘛(此处长度就是环中数的个数),一开始位置就正确的数不就是长度为1的环嘛,以此类推(例:长度为5的环:5,3,1,2,4)。

第一阶段我想的以环的长度递增方式扫描数组,并且调整每次扫描出来的环。比如长度为1的环调整次数为0,长度为2的环调整次数为1,...,长度为n的环的调整步数为n-1,你现在可能在想,长度为m的环可能有多个,是环间调整还是每个环单独调整,答案是单独调整最优,这个可以通过递推证明。

第二个阶段只需在第一个阶段上稍稍做下修改:为何非要按环的长度递增来寻找环呢,完全可以按数组下标去寻找环,然后统计。

需要注意的是需要对数组做标记,代码如下:

#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <queue>using namespace std;int  run(const int *a,int n) {bool *flag=new bool[n];int nums=n;int res=0;std::queue<int> que;int i=0,j=0;for(i=0;i<n;i++)flag[i]=false;i=0;while(nums!=0){while(flag[i])++i;j=i;que.push(j);while((j=a[j]-1)!=que.front())que.push(j);nums-=que.size();res+=que.size()-1;while(!que.empty()){flag[que.front()]=true;que.pop();}//while}//whilereturn res;}//int run()//start 提示:自动阅卷起始唯一标识,请勿删除或增加。int main(){   int a[]={5,3,1,2,4,10,8,6,7,9,11,13,12};std::cout<<run(a,13);} //end //提示:自动阅卷结束唯一标识,请勿删除或增加。


 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 360儿童手表二维码丢了怎么办 喜书郎电话手表二维码丢了怎么办 微信充话费充错号码怎么办 话费冲到了副卡怎么办 冲话费冲错了怎么办 微信支付未到账怎么办 速卖通修补配件到国外怎么办 速卖通流量低怎么办 速卖通被判定重复铺货怎么办 拼多多商品降权怎么办 运满满有了差评怎么办 房贷款还清后该怎么办 身份证被偷了怎么办啊 苹果手机wifi速度慢怎么办 电脑桌面上的图标不见了怎么办 夏天手机没地方放怎么办 上班手机没地方放怎么办 京东退款未到账怎么办 京东退款失败后怎么办 在京东申请退款怎么办 微信退款没收到钱怎么办 在拼多多不发货怎么办 扫二维码群发微信骗局怎么办 电脑高清晰音频管理器打不开怎么办 吃鸡耳机有杂音怎么办 分期付款车被朋友卖了怎么办 网上购物付款显示繁忙怎么办 同行招牌高于我的招牌怎么办 拼多多刷手退款怎么办 网银卡在手机上卸载了怎么办 企业网银密码忘了怎么办 网银钱转错了怎么办 民生百货购物卡过期了怎么办 新办卡注册过支付宝账号怎么办 床上用品专卖店没人进店怎么办 红蚂蚁咬了红肿痒怎么办 碎纸机轮不转了怎么办 轮滑鞋刀架螺丝圆了了怎么办 万朋商城2018年怎么办 超市盘点少了烟怎么办 歌华有线电视费用欠费好久怎么办