本文共 2304 字,大约阅读时间需要 7 分钟。
以下是一个完整的Objective-C实现,包括一个主函数来测试该算法:
#import @interface Solution : NSObject- (NSArray
- (NSArray *)combinationSum:(NSArray *)nums target:(NSNumber *)target;@end
+ (void)testCase{ NSArray *nums = @[@1, @2, @3]; NSNumber *target = @6; Solution *solver = [[Solution alloc] init]; NSArray *results = [solver combinationSum:nums target:target]; NSLog(@"Results: %@", results); } - (NSArray *)combinationSum:(NSArray *)nums target:(NSNumber *)target{ NSArray *result = [self backtrack:nums target:target]; return result; } - (NSArray*)backtrack:(NSArray*)nums target:(NSNumber*)target{ if ([target doubleValue] == 0) return [NSArray array]; if ([target doubleValue] < [nums[0] doubleValue]) return [NSArray array]; if (nums.count == 0) return [NSArray array]; NSArray *rest = [self backtrack:nums tail:1 target:target]; if (!rest) return [NSArray array]; [self processNumber:nums[0] target:target rest:rest]; return rest; } - (NSArray*)backtrack:(NSArray*)nums tail:(NSInteger)tail target:(NSNumber*)target{ if (tail == nums.count) return [NSArray array]; if ([target doubleValue] < [nums[tail] doubleValue]) return [self backtrack:nums tail:tail + 1 target:target]; return [self backtrack:nums tail:tail + 1 target:target]; } - (void)processNumber:(NSNumber*)number target:(NSNumber*)target rest:(NSArray*)rest{ if ([number doubleValue] == [target doubleValue]) [rest addObject:number]; else if ([number doubleValue] < [target doubleValue]) { [self processNumber:number target:target rest:rest]; [self processNumber:rest[0] target:target rest:rest tail:1]; } else { [self processNumber:rest[0] target:target rest:rest tail:1]; } } 通过上述实现,可以轻松地找到数组中所有组合和等于目标值的组合。例如,当输入数值为[1, 2, 3],目标值为6时,算法将返回所有可能的组合数组:
[ @1, @5, @2, @4, @3, @3, @6 ]
该算法通过递归回溯的方法,有效地探索所有可能的组合组合,确保找到所有满足条件的解。
如果需要更高效的性能,可以通过剪枝策略优化回溯过程,例如在发现当前路径的和已经超过目标值时提前终止递归。
转载地址:http://cjnfk.baihongyu.com/