leetcode做题记录0039

leetcode 0039

说明

只是为了记录一下,不求多快,也不深究。

会简要描述思路,代码中不写注释。

如碰到不会做的用了别人代码会在博客中标出。

题目描述

在这里插入图片描述

思路

一个深搜,用递归做,这方面的题还是不太熟,花了一点时间。

每添加一个数进来就把这个数放到temp里面,若到最后可以使得target为0,则证明有解,放到最终的List里面。

isSameLsit()这个方法是用来判断两个列表是否相同(元素相同元素顺序不同的情况),如果两个列表一样的话就不要重复加了。

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
		List<List<Integer>> ll = new ArrayList<List<Integer>>();
		getCombination(candidates, target, new ArrayList<Integer>(), ll);
		return ll;
	}

	public void getCombination(int[] candidates, int target, List<Integer> temp, List<List<Integer>> ll) {
		if (target == 0) {
			List<Integer> res = new ArrayList<Integer>();
			for (int a : temp) {
				res.add(a);
			}
			for (List<Integer> l : ll) {
				if (isSameList(temp, l)) {
					return;
				}
			}
			ll.add(res);
			return;
		} else if (target < 0) {
			return;
		} else {
			for (int a : candidates) {
				temp.add(a);
				getCombination(candidates, target - a, temp, ll);
				temp.remove(temp.size() - 1);
			}
			return;
		}
	}

	public boolean isSameList(List<Integer> temp, List<Integer> l) {
		if (temp.size() != l.size()) {
			return false;
		}
		List<Integer> t = new ArrayList<Integer>();
		for (int a : temp) {
			t.add(a);
		}
		Collections.sort(t);
		Collections.sort(l);
		for (int i = 0; i < l.size(); i++) {
			if (t.get(i) != l.get(i)) {
				return false;
			}
		}
		return true;
	}
}
发布了77 篇原创文章 · 获赞 1 · 访问量 2054

猜你喜欢

转载自blog.csdn.net/Paul_1i/article/details/105161287