1.两数之和


一、题目描述

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

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

你可以按任意顺序返回答案。
在这里插入图片描述

二、解题思路

可以这样去考虑,借助一个容器,先将数组中的第一个数字放到这个容器中,然后我们循环遍历数组中剩下的每一个数字,然后我们利用判断target和遍历的这个数字的差值是不是存在于我们容器中,或者说是不是和存的这个数相等,如果是就将这个数字返回就行。

三、代码编写步骤

第一步:创建一个map集合,集合是通过键值对的形式存储,既能遍历索引,也能通过索引找到其对应的值

第二步:先将nums集合中的第一个数存进map集合

第三步:循环nums中剩下的值,让每一个值都与target做差值,得到相应的差

第四步:map.containsKey(key)能够判断该key是否存在于map中,存在则返回true。这里如果存在则获取这个值的索引和值

第五步:在第一步存入map的第一个值与所有的值做完差之后,现在要更新map集合中存入的这个值再与nums中剩下的所有值进行判断

四、代码演示

import java.util.HashMap;
import java.util.Map;
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        //创建map集合对象
        HashMap<Integer, Integer> Map = new HashMap<Integer, Integer>();
        //添加nums数组中的第一个元素和索引到Map集合中
        Map.put(nums[0],0);
        for(int i=1; i<len; i++){
            int a = target-nums[i];
            if(Map.containsKey(a)){
                return new int[]{i, Map.get(a)};
            }
            Map.put(nums[i],i); //更新map集合中的值
        }
        //这里抛出的异常:表明向方法传递了一个不合法或不正确的参数,或者返回一个数组也可以。
        //throw new IllegalArgumentException("no two sum solution");
        return null;
    }
}

第5行:将nums的数组大小值赋给整型变量len。

第7行:创建一个map集合对象,用来存放键值对,其中key不能重复,没有顺序,相当于一个set集合。

第9行:Object.put(Object key, Object value):添加一个键值对,如果集合中的key重复,则覆盖原来的键值对。注意这里在put时是将值作为key,然后这里的value是数组的索引。

第10行:循环整个数组。

第11行:这一步逻辑很重要,以示例1为例吧,比如我的目标值是9,这里就假如i=1,nums[i]获取的是nums集合里面的值为2,那么target-nums[i]的值为7,赋给整型变量a。

第12行:这里if判断里面有一个boolean.containsKey(Object key)方法,这个方法返回Map集合中包含指定的键名,如果有返回true,否则放回false。括号中的参数放回的是要查询的Map集合的键名对象。

第13行:这里相当于定义了一个集合,集合里存放两个元素,第一个元素是当前for循环到的元素,第二个元素利用Object.get()方法返回的是key对应的value值,在这里就是相当于11行a=7的下标。

第17行:将每一次循环的数组元素,都以(值,下标)的方式存入到map集合中,利用map集合的特性,第9行说过,在map集合中如果key重复,则覆盖原来的值,这里就是覆盖原来第9行的Map.put(nums[0],0)的值。

第20,21行:这里抛出异常或者返回null,原因是想上面你的方法返回一个不合法或不正确的参数,或者返回一个数组也可以。相当于如果出现上面方法没有描述到的情况在这里不解决,直接抛给方法或者放回null。

这里返回回一个不合法或不正确的参数,或者返回一个数组也可以。相当于如果出现上面方法没有描述到的情况在这里不解决,直接抛给方法或者放回null。

新手小白刚开始刷题,所以注释做的比较详细,主要方便自己理解,解题没考虑相关的时间和空间复杂度,有什么不足之处希望多多体谅,虚心求教。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值