理论:
假设有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(); } } }
时间: 2024-11-12 06:36:59