寻找最快分解
给一个最近的例题吧,coding真是人间一大乐事
对于目标数num
可以通过两个公式将其分解为 1;
两个公司分别为
- num = num - 1;
- num = a*b;
找到最快分解为1的方式
- case1: 2,7
- 2可以分解为1 1
- 7分解为 7 = 6+1
- 6 = 2* 3
- 3 - 1 =2
- 2 = 11
返回 5
class NodeTestOne {
public static void main(String[] args) {
/*
其实就是找因数,如果为2,就是可行的,直接变,如果为4,就分成两个2,
如果为3,就-1,分成2和1
为6 就分成 2和3, 3!=2 ,继续拆分,如果3是质数,直接-1;
*/
List<Integer> list = new ArrayList<>();
List<Integer> listItr = new ArrayList<>();
List<Integer> curList = new ArrayList<>();
Integer record = 0;
list.add(2);
list.add(6);
for (int i = 0; i < list.size(); i++) {
int num = list.get(i);
if(num==1)continue;
if(num==2){
curList.add(0);
continue;
}
Iterator(list.get(i), listItr, num, curList);
}
System.out.println(curList.size());
}
private static void Iterator(Integer integer, List<Integer> listItr, int num, List<Integer> curList) {
if(integer==2){
curList.add(0);
return ;
}
for (int j = 2; j < integer; j++) {
if(j>num)break;
while(num%j==0){
if(j==2){
num = num / j;
curList.add(0);
break;
}else {
num = num / j;
curList.add(0);
listItr.add(j);
break;
}
}
}
int temNum = 0 ;
if(!listItr.isEmpty()){
for (int i = 0; i < listItr.size(); i++) {
temNum = listItr.get(i);
Iterator(listItr.get(i), new ArrayList<>(), temNum, curList);
}
}else if(listItr.isEmpty()&&integer>2){
integer -= 1;
temNum = integer;
curList.add(0);
Iterator(integer, new ArrayList<>(), temNum, curList);
}
}
}
这里重点mark下
curList.add(0);
是我用来统计次数的,因为int/Integer ++都不会返回正确的值
这里应该是和java值传递有关系
还是基础啊,比较疑惑,以后搞
最接近的三数之和
class NodeTestTwo {
public static void main(String[] args) {
int[] arr = {-100,-98,-2,-1};
int target = -101;
Deque<Integer> list = new ArrayDeque<>();
List<List<Integer>> listCol = new ArrayList<>();
boolean[] isUsed = new boolean[arr.length];
/*
其实就是找到所有的三数集合,来暴力枚举
1,2,1 2,1,4 1, 1,4
*/
recursion(list, listCol, isUsed, arr, 0);
System.out.println(listCol);
// list.stream().mapToDouble(d->d).sum();
List<Integer> list1 = listCol.stream().map((a)->{
return a.stream().mapToInt(d->d).sum();
}).collect(Collectors.toList());
int min = Integer.MAX_VALUE;
System.out.println(list1);
int res = 0;
for (int i = 0; i < list1.size(); i++) {
if(Math.abs(list1.get(i)-target)<min){
min = Math.abs(list1.get(i)-target);
res = list1.get(i);
}
}
System.out.println(res);
}
private static void recursion(Deque<Integer> list, List<List<Integer>> listCol, boolean[] isUsed, int[] arr, int position) {
if(position==3){
listCol.add(new ArrayList<>(list));
return;
}
for (int i = 0; i < arr.length; i++) {
if(!isUsed[i]){
list.addLast(arr[i]);
isUsed[i] = true;
recursion(list, listCol, isUsed, arr, position+1);
list.removeLast();
isUsed[i]=false;
}
}
}
}