题目:给定一个数n如23121;给定一组数字a如[2 4 9],求由a中元素组成的小于n的最大数
多测试样例:leetcode.cn/circle/disc… 代码参考:blog.csdn.net/Oblak_ZY/ar…
思路:
数字从左往右分析。 数组是递增有序的,从右往左分析,也就是先取最大的,再取次大的。 目的:在数组中找到等于该位的元素或者小于该位元素的最大值
- 如果数组中当前元素小于数字该位的值,就取上该最大元素,后面就不用分析了,全部填充该最大元素
- 如果数组中当前元素等于数字该位的值,就继续分析数字的下一位
- 如果数组中最小的元素都大于数字该位的值,就看一下当前分析的数字位数是第几位。如果是第一位,则继续从第二位开始;如果不是第一位,就退回一步
public class myTest {
static int value = 24132;
static String str = String.valueOf(value);
static int[] arr = {1,4,9};
static boolean DFS(int index, boolean flag, int sum, int[] arr){
if(index==str.length()){
System.out.println(sum);
return true;
}
if(flag){
return DFS(index+1,true,sum*10+arr[arr.length-1],arr);
}
else {
int tmp = str.charAt(index)-'0';
// System.out.println(tmp);
for(int i=arr.length-1;i>=0;i--){
if(arr[i]==tmp){
if(DFS(index+1,false,sum*10+arr[i],arr)){
return true;
}
} else if (arr[i]<tmp) {
if(DFS(index+1,true,sum*10+arr[i],arr)){
return true;
}
}
}
}
// 数组中最小的元素都大于数字该位的值
if(index!=0) return false; // 回溯一步(退回一步)
else return DFS(index+1,true,sum,arr);
}
public static void main(String[] args) {
DFS(0,false,0,arr);
}
}