5

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找和为目标值 target的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

方法一 暴力破解

解题思路:在数组中取一个数,与数组中其他数进行比对,相等就返回这两个数的数组下标。

示例 1:nums = [2,7,11,15]
2:7 11 15
7:11 15
11:15
取的数:需要进行对比的数。
[2, 7],[2, 11],[2, 15],[7, 11],[7, 15],[11, 15]
Java代码实现:
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        for (int i = 0; i < len - 1; i++) {
            for (int j = i + 1; j < len; j++) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        throw new IllegalArgumentException("no tow sum solution");
    }
}

NOTE!边界的取值
分析方法一:
时间复杂度:O(N^2)
空间复杂度:O(1)
在上面的代码中,我们可以在循环时记录一些信息,以省去一层循环。(以空间换时间)。进而可以选择用查找表的方法对上述问题进行优化。

方法二 查找表(哈希表)

哈希表:

key2711
value012
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        Map<Integer, Integer> hasMap = new HashMap<>(len - 1);
        hasMap.put(nums[0], 0);

        for (int i = 1; i <nums.length; i++) {
            if (hasMap.containsKey(target - nums[i])) {
                return new int[]{i, hasMap.get(target - nums[i])};
            }
            hasMap.put(nums[i], i);
        }

        throw new IllegalArgumentException("no tow sum solution");
    }
}

分析方法二:
时间复杂度:O(N)
空间复杂度:O(N)
时间复杂度描述了算法执行时间随输入数据规模增长的变化趋势。
空间复杂度描述了算法执行过程中所需额外空间随输入数据规模增长的变化趋势。

我的收获

  1. 通过两数求和的算法,复习了枚举法算法。
  2. 进一步对hashMap有了认识。

关于HashMap,我学习到了以下内容。

  1. HashMap是什么
    HashMap是一个键-值的映射,每个键都映射到一个值,并且我们可以使用该键从映射中检索相应的值。
  2. 为什么用HashMap而不使用List
    因为性能。
    如果我们想在一个List中找到一个特定的元素,时间复杂度是O(n),如果这个List是排序的,它将是O(log n),例如,使用二分查找。
    HashMap的优点是插入,删除和检索值的时间复杂度平均为0(1)。
  3. HashMap的基本操作。
    put(); 由键和值创建一个HashMap
    get(); 通过键从HashMap中检索值
    remove(); 从HashMap中删除一个键值映射
    containsKey(); 检查HashMap中是否存在键
    containsValue(); 检查HashMap中是否存在值
  4. HashMap和HashTable的区别
    同步
    Hashtable是线程安全的,可以在应用程序中的多个线程之间共享。
    HashMap不是同步的,因此它比Hashtable更快,使用的内存更少。其线程是不安全的。
    空值问题
    HashMap:允许键值为null
    HashTable: 不允许
    元素迭代
  5. 什么时候选择HashMap什么时候选择HashTable
    使用HashMap: 在非同步或单线程应用程序中选择使用HashMap。
    自JDK 1.8以来,Hashtable已被弃用。然而,ConcurrentHashMap是一个很好的哈希表替代品。我们应该考虑在多线程应用程序中使用ConcurrentHashMap。

参考文章

Java HashMap指南
HashMap和HashTable的区别


吴季分
390 声望13 粉丝