首页 > 代码库 > m元素集合的n个元素子集

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();        }    }}

 

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