现在遇到一个问题:
  需要在(0,n)之间得到一个二维的整数数组,要求:每行的值不一样,并且在数组中得到所有的行,列数为k,k<=n,怎么实现?
  比如说;
  (0,5),那么得到的数值应该在1,4之间,列数为2,这样的数组为
  1  2
  1  3
  1  4
  2  3
  2  4
  3  4
  总共这么6种情况,利用Java怎么实现?

解决方案 »

  1.   

    public int[][] get(int m, int n)
    {
    if (m >= n - 2) return null;
    int count = 0;
    int[][] mn = new int[(n-m-2)*(n-m-1)/2][2];
    for (int i = m + 1; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
    mn[count][0] = i;
    mn[count++][1] = j;
    }
    }
    return mn;
    }
      

  2.   

    恩,这种情况,我已经想到了,当然,我列举地只是最简单地情况,如果k值很大,比如10,20左右地,显然,利用for循环就不能达到目的了,刚才我又看了下,觉得这应该是一个排列组合地算法,请教各位怎么实现啊?
      

  3.   

    public class Test {
    private int[] temp;
    private int[][] result;  //保存结果
    private int n, k;
    private int row_count;  //行标

    public int[][] get(int n, int k)
    {
    temp = new int[k];
    int rows = c(n-1, k);  //计算行数,如果太大可能OutOfMemory。如有需要,可用其他方式保存数据,如输出到文件
    result = new int[rows][k];
    this.n = n - 1;
    this.k = k;
    search(0);  //生成结果

    return result;
    }

    private void search(int start)
    {         
    if(start == k)
    {
    for(int i = 0; i < k; i++)
    result[row_count][i] = temp[i];
    row_count++;
    return;
    }

    for(int j = (start == 0 ? 0 : temp[start-1]); j < n; j++)
    {   
    temp[start] = j + 1;
    search(start + 1);
    }   
    }

    private int c(long a, long b) 
    {
    long r1 = 1, r2 = 1;
    while (b > 0) {
    r1 *= a--;
    r2 *= b--;
    } return (int)(r1 / r2);
    }

    public static void main(String[] args){
    int[][] result = new Test().get(10, 5);

    //打印输出
    for (int i = 0; i < result.length; i++) {
    for (int j = 0; j < result[i].length; j++)
    System.out.print(result[i][j]+"\t");
    System.out.println();
    }

    }
    }