有一个和为num,现在想把它拆成多个正数之和,注意比如对于4拆成1+3和3+1实际是一种拆法。也就是每次拆成的List要是非降序的。
求最后拆成的结果:
析:想到递归,但是注意,要求升序,对于4,如果拆的前两个是1+2,最后成了1+2+1,并不是升序了。
好的方法是每次从右向左开始拆,拆的数据逐步减小。
保证本次拆的数据<=上次拆的数据
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
Main main = new Main();
System.out.println(main.FindContinuousSequence(6));
//System.out.println(main.FindContinuousSequence2(7,10));
}
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer> > res = FindContinuousSequence2(sum, sum+1);
// ArrayList中删除元素错误写法
/*for(ArrayList<Integer> t:res)
if(t.size()==1)
res.remove(t);*/
// ArrayList中删除元素正确写法
Iterator<ArrayList<Integer>> iterator = res.iterator();
while(iterator.hasNext()) {
ArrayList<Integer> t = iterator.next();
if(t.size()==1) {
iterator.remove();
}
}
// 排序
Collections.sort(res,new ListSort());
return res;
}
public ArrayList<ArrayList<Integer> > FindContinuousSequence2(int sum,int before) {
// before是上次拆出的数据
if(sum==0)
return new ArrayList<>();
ArrayList<ArrayList<Integer> > my = new ArrayList<>();
int start =Math.min(sum, before);
for(int f=start;f>=1;f--){
ArrayList<ArrayList<Integer> > next = FindContinuousSequence2(sum-f,f);
if(next.size()==0){
ArrayList<Integer> inner = new ArrayList<>();
inner.add(f);
my.add(inner);
}
else
for(ArrayList<Integer> t:next){
t.add(f);
my.add(t);
}
}
return my;
}
}
//比较ArrayList<Integer>对象
class ListSort implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// 注意返回结果,o1大就返回正数,o2大就返回负数,相等返回0
// TODO Auto-generated method stub
ArrayList<Integer> list1 = (ArrayList<Integer>) o1;
ArrayList<Integer> list2 = (ArrayList<Integer>) o2;
int l1=list1.size();
int l2=list2.size();
int min=Math.min(l1, l2);
int i=0;
while(i<min){
if(list1.get(i)==list2.get(i))
i++;
else
return list1.get(i)-list2.get(i);
}
if(l1>l2)
return 1;
else if(l1==l2)
return 0;
else
return -1;
}
}
注:FindContinuousSequence2(int sum,int before)方法得到的每个单独的ArrayList<Integer>是升序的,但是整个ArrayList<ArrayList<Integer>>并不是升序的。
所以在FindContinuousSequence方法中对结果进行了排序。
运行结果:
比如6
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 2], [1, 1, 1, 3], [1, 1, 2, 2], [1, 1, 4], [1, 2, 3], [1, 5], [2, 2, 2], [2, 4], [3, 3]]