力扣--两数之和--JAVA版


力扣热题100-----[1]两数之和


题目要求

//给定一个整数数组 nums 和一个整数目标值 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]
// 
//
// 
//
// 提示: 
//
// 
// 2 <= nums.length <= 103 
// -109 <= nums[i] <= 109 
// -109 <= target <= 109 
// 只会存在一个有效答案 

常规基本解法

class Solution {
    public int[] twoSum(int[] nums, int target) {

        int[] result={-1,-1};
//        淦恁娘的暴力搜索 双重循环
//        int n = nums.length;
//        for(int i=0;i

虽然能将题目解答出来,但是太过于暴力。。。。。

查看评论区之后才发现可以采用哈希表的方法来进行操作

//哈希表法
        // 建立k-v,一一对应的哈希表 在java中HashMap是无序的 加Linked之后是有序的
        LinkedHashMap hash = new LinkedHashMap();
        for (int i=0 ;i

哈希表解法过程

1.因为是求两数之和,已知数列和目标数

? 补数 = 目标数 - 加数

2.那么就可以创建一个 补数---下标 的哈希表

? 以示例一为例子

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

哈希表:

Key(target - nums[i]) Value
7 0
2 1
-2 2
-6 3

通过hash.containsKey()便可高效地查询到 加数 所差的 补数

通过这个题我学到的知识点

  • HashMap的基本使用

    hash.put(key,value);

    通过将数据放入到HashMap中对查找数据有如此大的提高!

    暴力二重For循环

    哈希表搜索

  • 在Java中HashMap中哈希表是无序的,需要使LinkedHashMap才能将哈希表变为有序的

    ? LinkedHashMap hash = new LinkedHashMap();

    HashMap hash = new HashMap();

    使用HashMap后,它生成的哈希表是无序的,有时候如果没有注意这个问题的话,可能会出现一些小BUG


    以上便是我这次做题的总结。