首页 > 其他 > 详细

m选n问题

时间:2014-07-28 16:39:55      阅读:443      评论:0      收藏:0      [点我收藏+]

有m长度的数组,从中随机选出n个,一般m远大于n。这样简单的问题乍一看居然没有特别好的办法,后来终于脑子清醒了,给出复杂度为O(n)的算法,java的:

int[] getRandomList(int[] a, int n) {

int[] result = new int[n];

Random ran = new Random();

for (int i=0; i<n; i++) {

int index = ran.nextInt(a.length-i);

result[i] = a[index];

a[index] = a[a.length-i-1];

a[a.length-i-1] = result[i];

}

return result;

}


如果数组不可改变:

int[] getRandomList(int[] a, int n) {

int[] result = new int[n];

Random ran = new Random();

Map<Integer, Integer> indexMap = new HashMap<Integer, Integer>();

for (int i=0; i<n; i++) {

int index = ran.nextInt(a.length-i);

int realIndex = index;

if (indexMap.containsKey(index)) {

realIndex = indexMap.get(index);

}

indexMap.put(index, a.length-i-1);

result[i] = a[realIndex];

}

return result;

}


本文出自 “7282813” 博客,请务必保留此出处http://7292813.blog.51cto.com/7282813/1531265

m选n问题,布布扣,bubuko.com

m选n问题

原文:http://7292813.blog.51cto.com/7282813/1531265

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!