Two Sum

https://oj.leetcode.com/problems/two-sum/

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

public class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] result = new int[2];
        java.util.HashMap map = new java.util.HashMap();
        for(int i = 0; i < numbers.length; i ++){
            map.put(numbers[i], i);
        }
        for(int i = 0; i < numbers.length; i ++){
            if(numbers[i] > target){
                continue;
            }
                if(map.containsKey(target - numbers[i]) && (Integer)map.get(target - numbers[i]) != i){
                    result[0] = i+1;
                    result[1] = (Integer)map.get(target - numbers[i]) + 1;
                    return result;
                }

        }
        return result;
    }
}

解题思路:

通过遍历两边数组的方法可以很容易求解,不过O(n^2),超时。

关键就在于借用hashmap,遍历数组每个数字,找另一个数字的时候,直接hasmap.get,时间复杂度为O(1),从而整个算法的时间复杂度就为O(n)了。

注意点:

考虑有重复元素,比如1,2,3,4,4。要求8。hashmap的value可以重复,key只能唯一。存入hashmap的时候,后面4的value会覆盖前面4的value。但对于本题不影响。因为只有唯一解,所以不存在有三个4的情况。所有遍历到第一个4,get的时候取出坐标5,一定得解了。

转载于:https://www.cnblogs.com/NickyYe/p/4220931.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值