iOS之从N个数里面取M个数的组合算法

原理分析

一个数组 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
        }

    }

猜你喜欢

转载自blog.csdn.net/Forever_wj/article/details/108269170