美文网首页
LeetCode热题1:Two Sum

LeetCode热题1:Two Sum

作者: 雪飘千里 | 来源:发表于2020-01-07 14:34 被阅读0次

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

最简单,也最容易的就是double for循环,但是时间复杂度太高了,是O(n^2);

其实,思维变换一下,我们是要在数组中找一个num 和 target -num的值,那我们可以搞成两个数组,第一个是原始数据nums1,第二个是target-num的数据nums2,这样的话,就变成了怎么在nums2数组中找到和nums1中相同的数,比如nums1 = {1,3,5,7,9},target=6;nums2={5,3,1,-1,-3};可以明显看出来,1,3,5在nums2中也存在,去除掉3(自身),就是1,5了。

那么怎么快速在nums2中找到是否存在和nums1中相同的值呢,使用Hash表。

代码实现一:
  1. 先把nums数组中值和索引存到HashMap中
  2. 循环nums数组,查找是否存在target-num的key,同时找到的key不能是自身
  3. 输出数组当前索引i,和找到值key对应的vlaue(目标索引)
import java.util.HashMap;
import java.util.Map;

public class twoSum {

    public static void main(String[] args) {
        int nums[] = {1,2,3,4,5};
        int target = 6;
        twoSum1(nums,target);

    }

    public static void twoSum1(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i],i);
        }
        for(int i=0;i< nums.length;i++){
            int temp = target-nums[i];
            if(map.containsKey(temp) && map.get(temp)!=i){
                System.out.println(i+"==="+ map.get(temp));
            }
        }
    }

代码实现二:

代码实现一其实会有数据重复的问题,比如会出现{1,5} 和 {5,1},下面的实现二不仅避免了重复问题,还是只循环了nums一次,降低了时间复杂度,从O(2n)降到了O(n)

import java.util.HashMap;
import java.util.Map;

public class twoSum {

    public static void main(String[] args) {
        int nums[] = {1,2,3,4,5};
        int target = 6;
        twoSum2(nums,target);

    }

    public static void twoSum2(int[] nums, int target) {

        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int temp = target-nums[i];
            if(map.containsKey(temp) && map.get(temp)!=i){
                System.out.println(i+"==="+ map.get(temp));
            }
            map.put(nums[i],i);
        }
    }
    
}

相关文章

网友评论

      本文标题:LeetCode热题1:Two Sum

      本文链接:https://www.haomeiwen.com/subject/ynskactx.html