LeetCode题解之两数之和

题目:两数之和

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

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

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

暴力题解:(Java版本)

首先第一个想法是暴力解题,使用两个循环嵌套,例如:第一层循环从数组从 i=0 号位开始,第二层循环从 j=i+1 开始,依次循环找到符合结果的两个数,然后返回其下标。

class Solution {
     
    public int[] twoSum(int[] nums, int target) {
     
        int[] sum = 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){
     
                    sum[0] = i;
                    sum[1] = j;
                    break;
                }
            }
        }
        return sum;
    }
}

在这里插入图片描述

哈希题解:(Java版本)

因为暴力解法的时间复杂度是属于 ,并不是最优解。
可以使用空间换时间,利用哈希表映射的方法,先把数组里所有元素的值作为 key ,下标作为 value 存进 Hashmap 里,从 Hashmap 里查找元素的时间复杂度近似常数O(1)
然后用一个for循环来遍历数组,比如设定 nums[i] 为第一个数,遍历的过程中一边查找另一个数targert - nums[i] 是否在 Hashmap 里;如果在,则证明是要找的数,否则继续查找。

class Solution {
     
    public int[] twoSum(int[] nums, int target) {
     
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i< nums.length; i++) {
     
            if(map.containsKey(target - nums[i])) {
     
                return new int[] {
     map.get(target-nums[i]),i};
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }
}

在这里插入图片描述

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