LeetCode 001:两数之和

题目:

给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中的元素。

示例:

给定 nums = [2,7,11,15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0,1]

作为Leetcode上的第一题,这道题的提交次数达到了60多万,通过率也达到了45%以上,是一道不折不扣的简单题。
思路:
首先把题目用数学公式表达出来:target = x + y,其中x和y是数组中的元素。由于target是输入量,是已知的,当我们确定了x的时候y也就确定了(y = target - x)。所以我们可以遍历nums中的元素nums[i],然后判断target - nums[i]是否在数组中即可。
解法一:
这种解法就是直白的把上面的解题思路用代码表示出来了:
1、创建一个HashMap
2、把nums中的每一个元素加入到map中去,key为num[i],value为i
3、循环遍历nums[i],从判断map中是否存在target - num[i],如果存在就是我们要找的值。

public int[] solution1(int[] nums, int target){
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(8);
    int[] res = new int[]{-1, -1};
    for (int i = 0; i < nums.length; ++i) {
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; ++i) {
        int t = target - nums[i];
        if (map.containsKey(t) && map.get(t) != i) {
            res[0] = i;
            res[1] = map.get(t);
            break;
        }
    }
    return res;
}

解法二:
这种解法本质上和上面的差不多,只是把两次循环换成了一次循环。在循环时先判断map中是否存在target - nums[i],如果存在就表明找到想要的数据了,如果不存在就把nums[i]添加到map中去。

public int[] solution2(int[] nums, int target){
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(8);
    int[] res = new int[]{-1,-1};
    for (int i = 0; i < nums.length; ++i) {
        if (map.containsKey(target - nums[i])) {
            res[0] = i;
            res[1] = map.get(target - nums[i]);
            break;
        }
        map.put(nums[i], i);
    }
    return res;
}

更多LeetCode文章:
https://github.com/ybjx/Leetcode

遗留问题:

上面的两种实现方法都使用了HashMap,并且把nums[i]作为key存放加入到map中去,从题目中我们发现,并没有说nums中的值不能重复。那么如果出现了重复的值会如何呢?上面的解法还能正常工作吗?

扫码关注
头条号:  微信公众号:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值