leetcode1.两数之和

104 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

解题思路:

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

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

思路:

首先第一反应就是暴力:

双层for循环,定住外层找内层,一旦内外元素相加为结果target,那么答案就是此时的内外下标,下标存到事先声明好的数组里return 注:这个思路唯一要注意的只有一点,内外两层要错一位(因为自己和自己相加为target的情况不算),此时外层注意别越界 思考: 此方法复杂度为 O(n^2)

太浪费 有没有啥办法能快一些?

利用合适的容器或许能解决问题
哈希表 键值对 ,查找的方式就可以解决问题 用合适的关系抽象出哈希表的键值对 target已知(定值) 与其两层循环去相加出 target 不如去数组里查一个值, 而这个值是一定在数组里的,且这个值应该由target与数组本身元素运算得来 即 a[i]关于target的补数 建立键值对 target-a[i] ~ i map.(target-a[i], i) 注:同样要注意(自己和自己相加为target的情况不算),所以要从a[i+1]开始查起,如果哈希表里有它,那么就是另外那个加数,且下标为此时的i加上1 最终,返回的是 [map.get(a[i+1]), i+1] 代码

//暴力法

class Solution {
    public int[] twoSum(int[] nums, int target) {
    int len = nums.length;
    for (int i = 0; i <len;i++){
        for(int j = 1; j < len;j++){
            if(nums[i]+nums[j]==target)
                return new int[]{i,j};
    }

}
    return new int[]{0};
}

//  k-v 一一对应的哈希表
class Solution{
   
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        Map<Integer,Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i <len;i++){
           if(map.get(target-nums[i]) != null)
               return new int[]{map.get(target-nums[i]),i}
           map.put(nums[i],i);
        }
        return new int[]{0};
    }

}