目录
问题描述
在使用记忆化搜索的时候,我们通常为了保存中间计算的结果,多数情况可以使用一个HashMap来记录不同key对应的value。但是假如key是一个数组的话,我们不能直接通过map.get()方法获取我们想要保存的值。简而言之,代码描述如下:
Map<int[], Integer>map = new HashMap();
map.put(new int[]{1,2,3}, 1);
System.out.println(map.get(new int[]{1,2,3}));
这里的输出结果是null
我们想让这里的结果输出为1,这才是我们的本意。那么为什么是这样的呢?
问题思路
因为当我们保存一个数组作为Map的key时,其实是保存的数组的引用地址的hashcode。也就是说,我们保存的数组的引用地址 和 map.get()这个数组的引用地址是不一样的,所以输出结果为null。换一种写法,就可以让结果输出为1,但是这往往不是我们所需要的。因为这个数组通常是在dfs()中,地址会一直变化。我们只是需要对应的内容作为key。那么应该怎么办呢?
Map<int[], Integer>map = new HashMap();
int[]arr1 = new int[]{1,2,3};
int[]arr2 = new int[]{1,2,3};
map.put(arr1, 1);
// 1
System.out.println(map.get(arr1));
// null
System.out.println(map.get(arr2));
问题解决
方法1:转为String
String 类型:[1, 2, 3]
Map<String, Integer>map = new HashMap();
int[]arr1 = new int[]{1,2,3};
int[]arr2 = new int[]{1,2,3};
map.put(Arrays.toString(arr1), 1);
// 1
System.out.println(map.get(Arrays.toString(arr1)));
// 1
System.out.println(map.get(Arrays.toString(arr2)));
方法2:使用List存储基本数据类型
1)如果是基本数据类型,则是value
2)如果是复合数据类型,则是引用的地址;
Map<List<Integer>, Integer>map = new HashMap();
List<Integer>list = new ArrayList();
list.add(1);
list.add(2);
map.put(list, 2);
List<Integer>list2 = new ArrayList();
list2.add(1);
list2.add(2);
System.out.println(map.get(list)); // 2
System.out.println(map.get(list2)); // 2
方法3:也许可以不使用Map, 可以试试用数组存储
在记忆化搜索中,如果想实现(i + j)作为key, 记录dfs(i, j)的value.那么可以直接使用一个二维数组即可。比如int[][]cache = new int[201][201];//题目中n的大小。
int[][]cache = new int[201][201];