01.两数之和

简介: 01.两数之和

01.两数之和

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 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]

来源:力扣(LeetCode)

解题思路1

我们分析一下题目可以很快想出一个朴素解法即双重循环暴力取值

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        int[] res = new int[2];
        for(int i=0;i<len;i++){
            for(int j=i+1;j<len;j++){
                if(nums[i]+nums[j]==target){
                    res[0]=i;
                    res[1]=j;
                    return res;
                }
            }
        }
        return res;
    }
}
执行用时:55 ms, 在所有 Java 提交中击败了25.59%的用户

内存消耗:41.6 MB, 在所有 Java 提交中击败了18.85%的用户

可以看出这种方法虽然可以成功但明显时间和空间复杂度都不优秀

解题思路2

利用HashMap来做,思路是map[target-nums[i]]=i ,即map的key存放的是目标值-数组元素 value存放的是数组下标

这样做的好处是什么,很容易想到 我们用一次循环来存放上述的key value,然后我们在利用一次循环数组元素并把数组元素作为key 来取值 如果取出的值不为空 则可以说明 此时 key+nums[value]=target。

为什么呢?因为我们map的key原本是target-nums[i],value是i,但我们第二次循环是把nums[i]作为key来取,如果此时取出的值不为空 必定说明 nums[i]是我们第一次循环存放的一个key 所以必定有 num[i]=target-nums[i]=key 而num[i]对应的value 与 target-nums[i]对应的value 就是我们要的答案

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++)
        {
            map.put(target-nums[i],i);
        }
        for(int i=0;i<nums.length;i++)
        {
            if(map.get(nums[i])!=null&&map.get(nums[i])!=i)
            {
                int[] res={i,map.get(nums[i])};
                return res;
            }
        }

        return null;
    }
}
目录
相关文章
|
23天前
|
Python
01、两数之和——2021-04-12
01、两数之和——2021-04-12
9 0
|
27天前
|
存储
Leetcode第29题(两数相除)
LeetCode第29题要求使用不包含乘法、除法和mod运算符的方法计算两个整数的商,通过记录结果的正负,将问题转化为负数处理,并利用二进制幂次方的累加来逼近除数,最后根据结果的正负返回相应的商。
14 0
|
1月前
|
Go Python
01.两数之和
01.两数之和
13 0
|
3月前
|
算法
LeetCode第29题两数相除
这篇文章介绍了LeetCode第29题"两数相除"的解题方法,通过使用加法、减法和二进制位移法代替常规的乘除操作,并考虑了整数溢出问题,提供了一种高效的算法解决方案。
LeetCode第29题两数相除
|
5月前
1.两数之和
1.两数之和
|
6月前
leetcode-29:两数相除
leetcode-29:两数相除
38 0
|
6月前
|
存储
leetcode-2:两数相加
leetcode-2:两数相加
40 0