zoukankan      html  css  js  c++  java
  • 力扣--两数之和--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


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

  • 相关阅读:
    Android APN开关原理
    HTC Wildfire 闪光灯手电筒的实现方式
    Android Stagefright MPEG4Extractor分析
    Ubuntu 10.10 64bit下使用Android NDK r6编译FFmpeg 0.8.1
    开始IMS学习相关名词和术语(持续更新)
    Ubuntu 下安装代码格式化程序 astyle
    Ubuntu 10.10 x64 安装 ffmpeg tutorial 相关支持库
    关于GradientDrawable的angle属性
    判断SIM卡所属的运营商
    最小生成树算法
  • 原文地址:https://www.cnblogs.com/printwangzhe/p/14475938.html
Copyright © 2011-2022 走看看