原理分析
一个数组 data 有 N 个元素,从中选取 M 个数的组合 array(不分顺序),可使用递归算法实现,过程如下:
- 选择 data 的第 1 个元素为 array 的第一个元素,即:array[0] = data[0];
- 在 data 第一个元素之后的其它元素中,选取其余的 M - 1 个数,这是一个上述问题的子问题,递归即可;
- 依次选择 data 的第 2 到 N - M + 1元素作为起始点,再执行1、2步骤;
- 递归算法过程中的 M = 0 时,输出 array 的所有元素。
Objective-C实现
// 源数组
@property (nonatomic, strong) NSMutableArray *dataArray;
// 过度数组
@property (nonatomic, strong) NSMutableArray *tempArray;
// 结果数组
@property (nonatomic, strong) NSMutableArray *resultArray;
- (void)viewDidLoad {
[super viewDidLoad];
self.dataArray = [[NSMutableArray alloc]init];
[self.dataArray setArray:@[@"1",@"2",@"3",@"4",@"5"]];
self.resultArray = [[NSMutableArray alloc]init];
self.tempArray = [NSMutableArray arrayWithArray:@[@"0",@"0",@"0",@"0",@"0"]];
[self combination:self.dataArray total:5 choose:5];
NSLog(@"%@",self.resultArray);
}
- (void)combination:(NSMutableArray *)dataArray total:(int)n choose:(int)m {
if (m == 0) {
[_resultArray addObject:[NSArray arrayWithArray:_tempArray]];
return;
}
for (int i = n; i >= m; i--) {
[_tempArray replaceObjectAtIndex:m-1 withObject:[_dataArray objectAtIndex:i-1]];
[self combination:dataArray total:i-1 choose:m-1];
}
}
Swift实现
var resultArray : [Int] = []
var tempArray : [Int] = []
override func viewDidLoad() {
super.viewDidLoad()
self.tempArray = [0,0]
self.resultArray = []
var numberArray : [Int] = [0,1,6,9,8]
self.combination(dataArray: numberArray, n: numberArray.count, m: self.tempArray.count)
print(self.resultArray)
}
func combination(dataArray:[Int], n: Int, m: Int) {
if m == 0 {
resultArray.append(contentsOf: tempArray)
return
}
var i = n
while i >= m {
tempArray[m - 1] = dataArray[i - 1]
combination(dataArray: dataArray, n: i - 1, m: m - 1)
i -= 1
}
}