LeetCode - 1 - TwoSum

Posted Piers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode - 1 - TwoSum相关的知识,希望对你有一定的参考价值。

题目

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

 

 

解法

一、暴力破解

想不到任何方法的时候这是最好的方法。先做起来,再思考如何优化。

具体而言,有等式 target = a + b,第一个循环确定 a,第二个循环 a 的右面搜索 b,搜索到了就返回。

    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> contains = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return null;
    }

暴力破解,时间复杂度O(n2),运行时间约为 41 ms。

 

二、Hash(Best Solution)

上面的方法搜索值比较慢,因为是一个一个搜索的。如何减少搜索时间就成了关键。

这里可以采取 Hash 技术,在数组中遍历搜索,当搜索时,在集合里搜索需要搜索的值存不存在,若存在,返回当前下标和搜索到的值的下标,若不存在,将该数字以及下标加入集合。由于这里采用 Hash 方法搜索,故复杂度很低,只有 O(1),上面是一个循环,为 O(n)。

    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> contains = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int right = target - nums[i];
            if (contains.containsKey(right)) {
                return new int[]{contains.get(right), i};
            } else {
                contains.put(nums[i], i);
            }
        }
        return null;
    }

Hash,时间复杂度为 O(n),运行时间约为 8 ms。

 

总结

搜索的时候利用 Hash 技术可以更快。

 

以上是关于LeetCode - 1 - TwoSum的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode - 1 - TwoSum

Leetcode Array 1 twoSum

LeetCode #1 TwoSum

leetcode 1_TwoSum. 哈希思想

LeetCode#1-TwoSum

leetcode笔记-1 twosum