LeetCode题解两数之和(三种方法)

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

题目分析:题中会给出一个nums整数数组和一个target值,在数组中找到2个数之和等于target并返回他们的下标,但是这2个数不能为同一个元素。比如nums :[1,2,3,4],target:6,数组中2和4的和等于6,所以返回数组中2,4的下标,就是 1,3。

解法一:暴力求解法
通过第一次遍历数组指定第一个数,在子遍历一遍数组找到第二数,把他们求和,如果等于target就返回他们的下标。反之继续遍历,直到找到这2个下标。

public int[] twoSum(int[] nums, int target) {
        //设置2个索引记录
        int indexOne = -1;
        int indexTwo = -1;
        //遍历数组
        for(int i=0; i<nums.length; i++){
            //在第一次遍历的基础上再次遍历
            for(int n=i+1; n<nums.length; n++){
                //找到目标
                if(nums[i]+nums[n] == target){
                    indexOne=i;
                    indexTwo=n;
                    return new int[] {indexOne,indexTwo};
                }
            }
        }
        return null;
    }

解法二:对于有序数组前后扫描
对于一个有序数组我们将2个指针分别放在11数组的首端和尾端,将这2个指针指向的值相加如果等于target就返回2个指针的下标,如果大于那么右指针就先前走一步,如果小于,左指针就向前走一步。
如图:
LeetCode题解两数之和(三种方法)_第1张图片

public int[] twoSum(int[] nums, int target){
        }
        //左指针
        int left = 0;
        //右指针
        int right = nums.length-1;
        //遍历数组
        while (left < right){
            //大于目标值右指针左移
            if(nums[left] + nums[right] > target){
                right--;
            }
            //小于目标值左指针右移
            else if (nums[left] + nums[right] < target){
                left++;
            }else {
                //找到目标值
                return new int[] {left,right};
            }
        }
        return null;
    }

注意:如果是无序数组经过排序之后使用此方法得到的答案是错误的,因为排序之后值的下标已经发生了改变。

解法三:使用HashMap
HashMap存放的是键和值,一个键对应一个值,所以我们可以用一个HashMap,遍历一次数值完成。首先我们从头开始遍历数组,拿到数组的值的时候。就可以从HashMap中找出有没有和等于target键,如果有则返回,如果没有就把这个值和他的下标作为键和值插入到HashMap中。一次遍历数组即可找到目标值。
如图:
LeetCode题解两数之和(三种方法)_第2张图片

public int[] twoSum(int[] nums, int target){
        //初始化一个HashMap,用于存放键和值
        Map<Integer,Integer> map = new HashMap<>();
        //遍历一次数组
        for(int i = 0; i < nums.length; i++){
            //需要在HashMap中找到的值
            int needKey = target - nums[i];
            //如果有
            if (map.containsKey(needKey)){
                return new int[] {map.get(needKey),i};
            } else {
                //没有找到
                map.put(nums[i],i);
            }
        }
        return null;
    }

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