在java代码中实现记忆时出错

cetgtptt  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(365)

回忆录给了我错误的答案。有人能帮帮我吗。如果没有记忆,我会得到正确的答案 targetBestR ,但在记忆函数中 targetBestM ,我得到了错误的值存储在数组列表中的各个键。

import java.util.ArrayList;

import java.util.HashMap;

public class TargetSumBest {

public static ArrayList<Integer> targetBestR(int n, int arr[]){
    if(n==0) return new ArrayList<Integer>();
    if(n<0) return null;
    ArrayList<Integer> shortestCombo=null;
    for(int i=0;i<arr.length;i++) {
        //System.out.println(i);
        //System.out.println(arr[i]);
        int rem=n-arr[i];
        //System.out.println(n+"-"+i+"="+rem);
        ArrayList<Integer> tar=targetBestR(rem, arr);
        if(tar!=null) {
            tar.add(arr[i]);
            if(shortestCombo==null||tar.size()<shortestCombo.size()) {
                shortestCombo=tar;
            }
        }
    }
    //System.out.println(n+"value"+shortestCombo);
    return shortestCombo;
}   
public static ArrayList<Integer> targetBestM(int n, int arr[], HashMap<Integer, ArrayList<Integer>> memo){
    if(n==0) return new ArrayList<Integer>();
    if(n<0) return null;
    if(memo.containsKey(n)) return memo.get(n);
    ArrayList<Integer> shortestCombo=null;
    for(int i=0;i<arr.length;i++) {
        //System.out.println(i);
        //System.out.println(arr[i]);
        int rem=n-arr[i];
        //System.out.println(n+"-"+i+"="+rem);
        ArrayList<Integer> tar=targetBestM(rem, arr,memo);
        if(tar!=null) {
            tar.add(arr[i]);
            if(shortestCombo==null||tar.size()<shortestCombo.size()) {
                shortestCombo=tar;

            }
        }
    }
    //System.out.println(n+"value"+shortestCombo);
    memo.put(n, shortestCombo);
    return shortestCombo;
}   
public static void main(String[] args) {
    int n=8; int arr[]= {1,4,2};

    System.out.println(targetBestM(n, arr, new HashMap<Integer, ArrayList<Integer>>()));
    System.out.println(targetBestR(n, arr));
}
}//error
5fjcxozz

5fjcxozz1#

找到了问题。传递到hashmap的数组不断被使用并添加到。能够通过在从hashmap读写时创建新的arrayList来修复它。
阅读时。。。

if (memo.containsKey(n)) {
        System.out.println(indent + n +  " memo.get(n) = " + memo.get(n));
        return new ArrayList<>(memo.get(n));
    }

写作时。。。

memo.put(n, new ArrayList<>(shortestCombo));

相关问题