java计算两数之和

两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解析

我自己的写法是:

class Solution {
    public int[] twoSum(int[] nums, int target) {
       for(int i=0;ii;j--){
                if((target-nums[i])==nums[j]){
                    return new int[]{i,j};
                }
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }
}

我这里的排序是参考list去重复,虽然这种方式也可以,但是有执行效率问题,
也就是时间复杂度过高。

后面看了一下官方解题:它们有三个答案。
第一种和我的差不多,for循环不一样罢了,这里不做解释了。
第二种,如下:

两遍哈希表

public int[] twoSum(int[] nums, int target) {
    Map map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
            return new int[] { i, map.get(complement) };
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

HashMap就不多说了吧,初学算法的都需要认识它。
想了解的下面是链接:

https://blog.csdn.net/cslbupt/article/details/67632248

上面两次循环,并不是嵌套,所以执行效率肯定优于第一种方法。

一遍哈希表

这种看起来代码更少,但实际上和第二种是一样的。

public int[] twoSum(int[] nums, int target) {
    Map map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[] { map.get(complement), i };
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

结尾说明:我也是初学算法,虽然这道题我用的方法最粗糙,不过也算是一种成功呢,加油,相信自己!

你可能感兴趣的:(逻辑计算)