文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
- LeetCode:55. Jump Game(跳远比赛)
- Leetcode:300. Longest Increasing Subsequence(最大增长序列)
- LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k
文章目录:
源码github地址:https://github.com/zhangyu345293721/leetcode
题目描述:
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
来源:力扣(LeetCode)
java实现方法1:利用递归方式
/**
* 获取所有的组合
*
* @param nums 数组
* @param target 目标值
* @return 所有组合
*/
public List<List<Integer>> combinationSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList();
List<Integer> current = new ArrayList<>();
Arrays.sort(nums);
helper(nums, target, result, current, 0);
return result;
}
/**
* 递归帮助类
*
* @param nums 数组
* @param target 目标值
* @param result 结果链表
* @param current 当前链表
* @param index 下标位置
*/
private void helper(int[] nums, int target, List<List<Integer>> result, List<Integer> current, int index) {
for (int i = index; i < nums.length; i++) {
if (nums[i] > target) {
break;
}
current.add(nums[i]);
if (target - nums[i] == 0) {
result.add(new ArrayList(current));
} else {
helper(nums, target - nums[i], result, current, i);
}
current.remove(current.size() - 1);
}
}
时间复杂度:O(n^2)
空间复杂度:O(n)
python实现方式1:
from typing import List
class Solution:
def combination_sum(self, nums: List[int], target: int) -> List[List[int]]:
'''
数组
Args:
nums: 数组
target: 目标值
Returns:
组合链表
'''
result = []
current = []
nums.sort()
self.helper(nums, target, result, current, 0)
return result
def helper(self, nums: List[int], target: int, result: List[List[int]], current: List[int], index: int) -> None:
'''
递归获取结果
Args:
nums: 数组
target:目标值
result:结果集
current:当前结果
index:下标
'''
for i in range(index, len(nums)):
if nums[i] > target:
break
current.append(nums[i])
if target - nums[i] == 0:
# 需要复制数组
result.append(list(current))
else:
self.helper(nums, target - nums[i], result, current, i)
current.pop()
时间复杂度:O(n^2)
空间复杂度:O(n)