【LeetCode】 Two Sum

问题描述:

给定一个数组和一个目标值,在这个数组中找到两个数,使得这两个数的和为目标值。返回这两个数的下标。

解决方法:

  • 1、暴力破解法
    ……

  • 2、哈希表Hash Table

参考资料:

http://blog.csdn.net/u012903926/article/details/47293521

    HashMap map = new HashMap();

/**
         * 通过指定key获取对应的value
         * 如果key值不存在,则返回null;
         * 如果key存在但是value为null,则返回null;
         * 如果key存在并且value不为null,则返回value的值;
         * 恰当的使用时机:已知key值存在(并且value不为null)的情况下,想要通过key找到value的时候
         */
    map.get();
        /**
         * 恰当的使用时机:当要判断map中是否包含了键key的时候
         * 如果包含key但是对应的value值为null,则返回ture
         * 如果包含key并且对应的value值存在,则返回value
         * 如果不包含key,则返回false
         */
    map.containsKey();

        /**
         * 以上同理
         */
    map.containsValue();

时间效率:
  在暴力破解方法中的时间复杂度之所以是O(n2),是因为该方法中有两层循环。第一层循环为O(n),第二层也为O(n)。如果使用Hash Table,以空间换时间,并且Hash函数选取合适,那么第二层的查找可以达到O(1),但是空间复杂度就会提高到O(n)。
  在java中,HashMap就是最好的选择。

多考虑一点:
面对这样一个输入[ 5 , 3 , 5 ],目标sum是 10 的情况。
因为map的key值不允许重复,所以map中的元素只有两个{5,2}和{3,1}。因为题目中“假设题目的解只有一种情况”。当sum[i]指向第一个5的时候,target=sum-sum[i]=5。通过map查找key=5的元素的下标是得到的map.get( target )为2。此时得到一个解:下标为0和2的元素满足目标和为10。此时立即返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值