码迷,mamicode.com
首页 > 其他好文 > 详细

m选n问题

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

标签:m选n

有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问题

标签:m选n

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!