알고리즘: 출력 n 개 수 에서 m 개 수 를 임의로 추출 하 는 조합

2420 단어
어디서 본 문 제 를 잊 어 버 렸 어 요. 오늘 실 현 했 어 요. 원래 m 개의 지침 을 사용 해 보 려 고 했 는데 실현 이 귀 찮 고 재 귀 할 수 있 으 면 간단 해 요.저 는 int [] 시 뮬 레이 션 바 이 너 리 + 1 작업 을 사 용 했 습 니 다. 0 은 없 음 을 나타 내 고 1 은 있 음 을 나타 내 며 바 이 너 리 배열 + 1 이 있 으 면 m 개 1 이 있 으 면 하나의 조합 이 라 고 생각 합 니 다.
코드 는 다음 과 같 습 니 다:
    private List<int[]> numList;

    /**
     * input : n , m
     * output : display the combinations for (select m numbers from n)
     * @param n
     * @param m
     */
    public void outputCombinationNumbers(int n, int m){
        List<int[]> arrayList = new ArrayList<int[]>();
        int[] b = new int[n];
        add1ForBits(b, m);
        if(numList != null){
            System.out.println(JSON.toJSON(numList));
        }
    }

    /**
     *
     * @param b
     * @param m
     */
    public void add1ForBits(int[] b, int m){
        numList = new ArrayList<int[]>();
        int[] a = null;
        if(b == null){
            return;
        }
        int count1 = 0;
        int length = b.length;
        int lcount = (int)Math.pow(2.0, length + 0.0);
        for(int i=1;i<lcount;i++){
            a = new int[m];
            if(add1ForBitArray(b, m, a)){
                numList.add(a);
            }
        }
    }

    /**
     *       1,         +1,           m  1,     ,        /  1   
     * @param b
     * @param int[] a ,   m 1   
     * @return true   ,false    
     */
    private boolean add1ForBitArray(int[] b, int m, int[] a){
        boolean flag = true;
        if(b == null){
            return false;
        }
        int length = b.length;
        int count = 0;
        for(int i=length-1;i>=0;i--){
            if(b[i] == 0){
                if(flag){
                    b[i] = 1;
                    flag = false;
                    count++;
                    if(count > m){
                        return false;
                    }
                    a[count-1] = i;
                }
            } else {
                if(flag){
                    b[i] = 0;
                }else {
                    count++;
                    if(count > m){
                        return false;
                    }
                    a[count-1] = i;
                }
            }
        }
        if(count == m){
            return true;
        }
        return false;
    }

댓 글 을 올 리 는 것 을 환영 합 니 다. 더 좋 은 방법 이 있 으 면 교 류 를 환영 합 니 다.

좋은 웹페이지 즐겨찾기