leetcode hot1 两数之和

71 阅读2分钟

问题 双数之和

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入: nums = [2,7,11,15], target = 9
输出: [0,1]

输入: nums = [3,3]
输出: []

解答思路1 暴力双循环

public static int[] map_sum(int[] nums, int target) {
    HashMap<Integer, Integer> map = new HashMap<>();
    int  arry[] = new int[2];
    
    // key: 值  value:位置
    for (int i=0; i< nums.length; i++){

        if (map.containsKey( nums[i])){
            System.out.println("已经存在了这个值");
        }else{
            map.put(nums[i], i);
        }

        // 计算target 和当前的差值
        int diffenence = target-nums[i];
        if (map.containsKey(diffenence)){

            //得到位置
            int  local2 = map.get(diffenence);
            int result[] =  {local2, i};
            return  result;
        }
    }
    return arry;
}

解题思路2 哈希表

创建一个哈希表,对于每一个 x,首先查询哈希表中是否已存在 target - x,如果存在那么就已经找到了答案,不存在直接将 x 插入到哈希表中,方便下一次快速匹配。

原本错误的版本:

public static int[] map_sum(int[] nums, int target) {

    HashMap<Integer, Integer> map = new HashMap<>();

    int  arry[] = new int[2];

    // key: 值  value:位置
    for (int i=0; i< nums.length; i++){

        if (map.containsKey( nums[i])){
            System.out.println("已经存在了这个值");
        }else{
            map.put(nums[i], i);
        }

        // 计算target 和当前的差值
        int diffenence = target-nums[i];
        if (map.containsKey(diffenence)){

            //得到位置
            int  local2 = map.get(diffenence);
            int result[] =  {local2, i};
            return  result;
        }

    }

    return arry;
}

错误的原因

  1. 不需要在意是否存在重复的,反正都要加到哈希表里面。检测重复反而会出现问题。
  2. 代码风格,注释等

修改后的版本,比较符合我的编码习惯


 public int[] twoSum(int[] nums, int target) {

        HashMap<Integer, Integer> map = new HashMap<>();
        int  arry[] = new int[2];
        // key: 值  value:位置
        for (int i=0; i< nums.length; i++){
            // 计算target 和当前的差值
            int diffenence = target-nums[i];
            if (map.containsKey(diffenence)){

                //得到位置
                int  local2 = map.get(diffenence);
                int result[] =  {local2, i};
                return  result;
            }
            map.put(nums[i], i);
        }

        return arry;
    }