m元素集合的n个元素子集

理论:

假设有5个元素的集点,取出3个元素的可能子集如下:
{1 2 3}、{1 2 4 }、{1 2 5}、{1 3 4}、{1 3 5}、{1 4 5}、{2 3 4}、{2 3 5}、{2 4 5}、{3 4 5}

这些子集已经使用字典顺序排列,如此才可以观察出一些规则:
如果最右一个元素小於m,则如同码錶一样的不断加1
如果右边一位已至最大值,则加1的位置往左移
每次加1的位置往左移后,必须重新调整右边的元素為递减顺序

java实现:

package 经典;
public class NofM {
    private int m;
    private int[] set;
    private boolean first;
    private int position;
    
    public NofM(int n, int m) {
        
        this.m=m;
        first=true;
        position=n-1;
        
        set=new int[n];
        for(int i=0; i<n; i++)
            set[i]=i+1;
    }
    
    public boolean hasNext(){
            return set[0]<m-set.length+1;
    }
    
    public int[] next(){
        
        boolean flag=false;
        if(first)
        {
            first=false;
            return set;
        }
        
        if(set[set.length-1]==m)
        {
            position--;
            flag=true;
        }
        else
        {
            position=set.length-1;
        }
        set[position]++;
        
        // 調整右邊元素 
        if(flag==true)
        {
        for(int i=position+1; i<set.length; i++)
            set[i]=set[i-1]+1;
        }
        return set;
    }
    
    public static void main(String[] args) {
        NofM nofm=new NofM(3,5);
        
        while(nofm.hasNext())
        {
            int[] set=nofm.next();
            
            for(int i=0; i<set.length; i++)
                System.out.print(set[i]);
            System.out.println();
        }
    }
}
原文地址:https://www.cnblogs.com/huangcongcong/p/4008427.html