LeetCode01—两数之和(java版)

题目描述:

标签:数组    哈希表

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。

示例:

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

 代码:

一、方法一:双重for循环

思路分析:暴力算法,暴力配对验证。时间复杂度O(n^2)

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

 二、方法二:使用HashMap

思路分析:时间复杂度O(n)

①创建一个HashMap存放键值对<key,value>,其中key用来保存第i个数字,value用来保存对应数字的下标,即key=nums[i],value=i

②循环整个数组,定义一个临时变量temp,用来保存 目标值-当前数字

③判断当前map中是否含有key=temp的对象,其中用到map.containsKey() 方法判断 Map 集合对象中是否包含指定的键名。如果 Map 集合中包含指定的键名,则返回 true,否则返回 false。

  3.1 如果包含,则返回key=temp对象对应的value即下标值,以及当前数字的下标值。其中用到map.get(key)方法返回key对应的value值。

  3.2 如果不包含,则将当前数字及下标构成的键值对加入map中

注意:一开始的想法是创建一个map,然后循环一遍把所有的<数字,下标>加入map。然后再循环判断 目标值 - 当前数字 是否在map中。也就是用了两个一阶for循环。后来想想也没必要,因为起码两个数字相加才能构成一对输出的下标。所以可以在每次循环判断中不断加入键值对。

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

猜你喜欢

转载自blog.csdn.net/qq_40840749/article/details/112205657