LeetCode算法刷题---TwoSum

算法难度easy

问题描述

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

解题思路

    最初的设想的是遍历数组两次,求和与目标值比较,计算出值。后来发现可以通过hashMap解决问题,即解法二,解法三是参考官方答案,想了想,思路的却很奇特。

import java.util.HashMap;

/**
 * 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
 *
 * 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
 */
public class TwoSum_1 {
    private static int[] result=new int[2];

    public static void main(String[] args){
        int[] arr={2,6,89,9,12};
        int target=14;
//        int[] ints = func1(arr, target);
//        int[] ints = func2(arr, target);
        int[] ints = func3(arr, target);
        System.out.println(ints[0]);
        System.out.println(ints[1]);
    }

    /**
     * 将给定数组遍历两遍,时间复杂度为O(n2)
     * @param arr
     * @param target
     * @return
     */
    public static int[] func1(int[] arr,int target){
        for (int i=0;i<arr.length;i++){
            for (int j=i+1;j<arr.length;j++){
                if(arr[i]+arr[j]==target){
                    result[0]=i;
                    result[1]=j;
                }
            }
        }
        return result;
    }

    /**
     * 通过遍历数组,将元素的值作为key,下标为value,存入hashMap中,
     * 第二次遍历数组时,将目标与遍历的数作差,差值是否存在map中
     * 通过containsKey的方法比较值,时间复杂度O(n)
     * @param arr
     * @param target
     * @return
     */
    public static int[] func2(int[] arr,int target){
        HashMap<Integer, Integer> map = new HashMap<>();

        for (int i=0;i<arr.length;i++){
            map.put(arr[i],i);
        }

        for (int j=0;j<arr.length;j++){
            int sub = target - arr[j];
            if(map.containsKey(sub)){
                result[0]=map.get(sub);
                result[1]=j;
            }
        }
        return  result;
    }


    /**
     * 在进行迭代并将元素插入到哈希表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。
     * 如果它存在,那我们已经找到了对应解,并立即将其返回。
     * @param arr
     * @param target
     * @return
     */
    public static int[] func3(int[] arr,int target){
        HashMap<Integer, Integer> map = new HashMap<>();

        for (int j=0;j<arr.length;j++){
            int sub = target - arr[j];
            if(map.containsKey(sub)){
                result[0]=map.get(sub);
                result[1]=j;
            }
            map.put(arr[j],j);
        }
        return  result;
    }
}

如有代码不规范之处,烦请指出,谢谢...

猜你喜欢

转载自www.cnblogs.com/fengyue0520/p/10612324.html