算法难题求解——来自QQ空间(有答案)

nums 1 3 5  target 7

正解应该是 1*2 + 5 = 7 和 1 + 3*2 = 7

1.尽量都用到数

2.相加最接近target

3.正解可能不唯一,用到nums最大数,用的最多的解放在前面

求解

我自己想的是
 static List<Map<Integer, Integer>> match(int[] nums, int target) {

//1.所有的元素都需要包含
//2.最优的策略=最少的元素个数->从使用最大的元素开始开始

Map<Integer, Integer> map = new HashMap<>();
if (nums == null || nums.length == 0) {
return null;
}

int remain = target; //剩余量
//最终结果
List<Map<Integer, Integer>> list = new ArrayList<Map<Integer, Integer>>();

//从最大的是数值开始获取数据
for (int i = nums.length-1 ; i>0 ; i--) {
for (int num : nums) {
while (remain >= num) {
int cnt = 0;
if (map.containsKey(num)) {
cnt = map.get(num);
}
map.put(num, cnt + 1);
remain = remain - num;
}
}
if (remain == 0) {//正好匹配
list.add(map);
}else{
//如果不匹配还需要判断
}
map = new HashMap<>();
remain = target;
nums = deleteFirst(nums);
}

return list;
}
求优化 求最优解 

猜你喜欢

转载自blog.csdn.net/jzy3711/article/details/84143468
今日推荐