算法:两数之和(优化)

题目描述:

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [2,7]


思路分析:

简单来说暴力枚举,俩个for循环嵌套,就一个个试出来了。

优雅一点,就知道数据结构的魅力了...(我也刚明白)

合理运用Map,因为map取值是O(1) [没有hash相同的key时O(1)]。

  1.   遍历数组,给map,添加键值对
  2. 从map里找另一个值(其值为  target结果 - 当前遍历的array[i])
  3.      2.1 找到另一个的值
  4.            2.1.1 找到另一个的值且  不相等(相加的2个数)
  5.            2.1.1 找到另一个的值且  相等且 其键大于1(基本为2);      ps:键为几,就是数组中存在几个key值

代码:


import java.util.HashMap;
public class AddNum {
    int[] add(int[] array, int target){

        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < array.length; i++) {
            /*1.添加键值对*/
            if (!map.containsKey(array[i])) {
                //map里没有该键
                map.put(array[i], 1);
            }
            else {
                //map里已经存在该键,让存储的值+1
                //因为可能会出现两个相等的值的和为target,例2+2=4;就是数组中可能有两个2
                map.put(array[i],map.get(array[i])+1);
            }

            /*2.从map里找另一个值*/
            //需要在map里找的值
            int val = target - array[i];
            if (map.containsKey(val))
            {
                /*2.1 找到另一个的值*/
                // 如果map里有该值了
                /*2.1.1 找到另一个的值且  不相等(相加的2个数)*/
                if (val != array[i])
                {
                    //val和array[i不同,找的不是自己,并且找到了
                    return new int[]{val,array[i]};
                }

                /*2.1.1 找到另一个的值且  相等且 其键大于1(基本为2);      ps:键为几,就是数组中存在几个key值*/
                //判断是否为target = target/2 +  target/2,即在map里找到自己
                if (val == array[i] && map.get(val) > 1)
                {
//                    满足
//                    数组里不止一个val
                    return new int[]{val,array[i]};
                }

            }

        }

        //不存在,返回空
        return new int[0];
    }


    public static void main(String[] args) {
//        int[] ints = {13, 7, 12, 16};
        int[] ints = {13, 7, 14, 15,14};
        int[] add = new AddNum().add(ints, 28);
      
    }

}

 

 

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页