记忆化搜索中,不要使用数组int[]作为Map的key,可以用List作为Map的key——Java

目录

问题描述

问题思路

问题解决

方法1:转为String

方法2:使用List存储基本数据类型

方法3:也许可以不使用Map, 可以试试用数组存储

问题描述

在使用记忆化搜索的时候,我们通常为了保存中间计算的结果,多数情况可以使用一个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];

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值