LeetCode 精选 TOP 面试题(Java 实现)—— 两数之和

一、题目描述

1.1 题目
  • 两数之和

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

  • 示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1.2 知识点
  • 链表
1.3 题目链接

二、解题思路

2.1 自研思路

  这道题我刚开始的思路是使用双指针来解决,但是定睛一看才发现这道题并没有强调数组的有序性,这也就意味着需要进行搜索的数组可能是无序数组,而我们知道对于双指针算法的使用需要数组具备有序性,因此如果使用双指针的思路来接这道题就需要先将数组进行排序,但随之而来的问题就是当数组排序后,数组中的下标就已经发生了改变,因此此时再通过双指针算法求得的下标就是错误的,所以我们还需要通过 Map 等数据结构来保存原数组中数据和下标的映射关系。

  所以在思考之后,我换了一种思路,如果说需要查找两个数的和 sum,那么当数组中存在 a+b=sum 时,这里我们如果假设其中的一个数字 a 是已经确定的固定值,那么我们只需要在数组中再搜索 b=sum-a 就可以了,并且通过散列表的这种数据结构,我们能够将查找数字 b 的时间复杂度降低到 O(1) ,这也就是自研实现中的实现思路。

2.2 示例思路

  实例代码中的思路跟自研代码是基本一致的,但自研代码的不足之处如下:

  • 没有很好的进行异常处理(包括返回值的处理);
  • 没有对 HashMap 的初始容量进行设置,可能会因为后面的动态扩容而造成性能问题;

三、实现代码

3.1 自研实现
class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        for(int i = 0; i < nums.length; i++) {
            if (hashMap.containsKey(nums[i]))
                return new int[]{hashMap.get(nums[i]), i};
            else 
                hashMap.put(target - nums[i], i);
        }
        return new int[2];
    }
}
3.2 示例代码
class Solution {
   public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>((int) ((float) nums.length / 0.75F + 1.0F));
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]), i};
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum value");
    }
}
发布了244 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40697071/article/details/103903112