LeetCode1.两数之和(超简单讲解)

1.两数之和

题目

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

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

示例

示例1

java 复制代码
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 

示例2

java 复制代码
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例3

java 复制代码
输入:nums = [3,3], target = 6
输出:[0,1]

解题思路

哈希表

以第一个例子nums=[2,7,11,15],target = 9 为例,对数组中的每个元素而言,我们可以找和这个元素相加为target的元素(暂且称为互补元素),如果这个互补元素存在,那么就输出它们的下标:

  • 2:存在7,使得2+7=9,它们符合条件
  • 7:存在2,使得7+2=9,它们符合条件
  • 11,不存在-2,使得11+(-2)=9,不符合条件
  • 15,不存在-6,使得11+(-6)=9,不符合条件
    可以看到2+7和7+2这两种情况其实重复输出了,为了避免重复输出,那么我们可以遍历数组,并逐个把元素放入HashMap,在放入的时候,就判断对于当前元素,现在HashMap中是否有互补元素,如果有就直接输出他们的下标,不将互补元素放入哈希表中。否则,如果对于当前元素,现在HashMap中没有互补元素,那么我们就将当前元素放入哈希表中。
    同时,HashMap也可以保证,值相同的元素只会放入一次,如果nums=[2,2,7,11,15],target = 9 ,那么2也只会被放入一次。

实现设计

复制代码
可以用HashMap存放<元素值,元素下标>键值对,如果符合条件的元素存在,就将他们的下标输出。否则就将这个元素和它的小标存入哈希表。

详细代码

java 复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
    	//map的键存在元素值,map的值存在元素的下标
        HashMap<Integer,Integer> map = new HashMap<>();
        //res存放符合条件的下标对
        int[] res=new int[2];
        for(int i=0;i<nums.length;i++){
        	//tmp中暂存当前元素的互补元素
            int tmp = target-nums[i];
            //如果现在哈希表中存在当前元素的互补元素,把它们的下标放入res
            if(map.containsKey(tmp)){
                res[0]=i;
                res[1]=map.get(tmp);
            }else{
                map.put(nums[i],i);
            }
        }
        return res;
    }
}
相关推荐
行走的bug...2 分钟前
用图论来解决问题
算法·图论
nsjqj1 小时前
数据结构:优先级队列(堆)
数据结构
岁忧1 小时前
(LeetCode 每日一题) 3541. 找到频率最高的元音和辅音 (哈希表)
java·c++·算法·leetcode·go·散列表
pusue_the_sun1 小时前
每日算法题推送
算法·双指针
JasmineX-12 小时前
数据结构——顺序表(c语言笔记)
c语言·开发语言·数据结构·笔记
KyollBM2 小时前
【Luogu】P9809 [SHOI2006] 作业 Homework (根号算法)
算法
jmxwzy2 小时前
leetcode274.H指数
算法
纪元A梦2 小时前
贪心算法应用:信用评分分箱问题详解
java·算法·贪心算法
I'm a winner3 小时前
第五章:Python 数据结构:列表、元组与字典(一)
开发语言·数据结构·python
过河卒_zh15667663 小时前
9.13AI简报丨哈佛医学院开源AI模型,Genspark推出AI浏览器
人工智能·算法·microsoft·aigc·算法备案·生成合成类算法备案