力扣--两数之和--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<n;i++){
//            for(int j=1;j<n;j++){
//                if(nums[i]+nums[j]==target&&i!=j)
//                {
//                    result[0] = i;
//                    result[1] = j;
//                    break;
//                }
//            }
//        }
  	 	return result;

    }
}

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

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

//哈希表法
        // 建立k-v,一一对应的哈希表 在java中HashMap是无序的 加Linked之后是有序的
        LinkedHashMap<Integer,Integer> hash = new LinkedHashMap<Integer, Integer>();
        for (int i=0 ;i<nums.length;i++) {
            //存入数据 key为补数 value为下标
            if(hash.containsKey(nums[i])){
                result[0] = hash.get(nums[i]);
                result[1] = i;
                return result;
            }
            //存入数据 key为补数 value为下标
            hash.put(target - nums[i],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()便可高效地查询到 加数 所差的 补数

image-20210303171034284

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

  • HashMap的基本使用

    hash.put(key,value);

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

    暴力二重For循环

    image-20210303172132828

    哈希表搜索

    image-20210303172329983

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

    LinkedHashMap<Integer,Integer> hash = new LinkedHashMap<Integer, Integer>();

    image-20210303172814502

    HashMap<Integer,Integer> hash = new HashMap<Integer, Integer>();

    image-20210303172955115

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


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

原文地址:https://www.cnblogs.com/printwangzhe/p/14475938.html