LeetCode 精选百题斩-1-两数之和

题目信息

题号:1
题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

题目难度:简单
测试参数:

参数一  输入:nums = [2,7,11,15], target = 9  输出:[0,1]
参数二  输入:nums = [3,2,4], target = 6      输出:[1,2]
参数三  输入:nums = [3,3], target = 6        输出:[0,1]

提示信息:只会存在一个有效答案

解法一:暴力解法

题解思路:

由于题目说明同一个元素在答案里不能重复出现,所以采用双层循环寻找,外层循环从第一个数组元素开始找,
里层循环每次都是基于外层循环的开始值往后找,这样在保证不使用同一元素的前提下暴力循环找到相加等于目标值的两个元素

LeetCode 精选百题斩-1-两数之和_第1张图片
java代码示例

public static int[] twoSum(int[] nums, int target) {
    int length = nums.length;
    for (int i=0;i<length;i++){
        for(int k=i+1;k<length;k++){
            if(nums[i] + nums[k] == target){
                return new int[]{i,k};
            }
        }
    }
    return null;
}

在这里插入图片描述
复杂度分析:
时间复杂度:O(n²)
空间复杂度:O(1)

解法二:基于Hash表

题解思路:

由于题目需要找的是两个数组元素加起来等于目标值的数据那么我们可以转换一下思路,其实也是遍历每个元素,寻找是否存在target-nums[i]的数据。
于是,我们可以借助哈希表的快速查询的特性,先遍历一遍数组,把每个元素存进Map中,key为数组元素,value为数据下标。
第二次再遍历数组,从Map中找是否存在匹配的数据,存在即返回。

LeetCode 精选百题斩-1-两数之和_第2张图片
java代码示例

public static int[] twoSum(int[] nums, int target) {
   Map<Integer,Integer> numMap = new HashMap<>();
    for(int i=0;i<nums.length;i++){
        numMap.put(nums[i],i);
    }
    for(int i=0;i<nums.length;i++){
        Integer num = numMap.get(target - nums[i]);
        if(num != null && !Objects.equals(num,i)){
            return new int[]{i,num};
        }
    }
    return null;
}

在这里插入图片描述
复杂度分析:
时间复杂度:O(n) 只有一层循环
空间复杂度:O(n) 空间换时间

解法三:一次循环

题解思路:

基于解法二的思路,还是采用,开辟Map空间来换取时间,但是解法二再第一次循环只开辟Map并赋值,并没有做其他处理。题目要求的是只会存在一个有效答案,于是我们可以在开辟Map的同时,查找一下是否在已开辟的空间存在于当前遍历的数组元素匹配的数据,存在返回即可,无需后续流程。

LeetCode 精选百题斩-1-两数之和_第3张图片
java代码示例

public static int[] twoSum(int[] nums, int target) {
    Map<Integer,Integer> numMap = new HashMap<>();
    for(int i=0;i<nums.length;i++){
        Integer num = numMap.get(target - nums[i]);
        if(num != null && !Objects.equals(num,i)){
            return new int[]{i,num};
        }
        numMap.put(nums[i],i);
    }
    return null;
}

在这里插入图片描述
复杂度分析:
时间复杂度:O(2n) ≈ O(n)
空间复杂度:O(n)

总结

一般算法题拿到手后,如果没有好的思路,可以试试暴力解法,先解决问题!然后再思考是否有更优解的方式实现!
该题在LeetCode属于简单算法题!整体思路大概这样,主要还是多刷一下找找题感吧!

你可能感兴趣的:(算法,leetcode,算法)