zoukankan      html  css  js  c++  java
  • LeetCode之两数之和超详细java讲解

    描述:给定一个整数数组nums和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。(具体要求请参考下面链接https://leetcode-cn.com/problems/two-sum/)

    思路一:当然是暴力...暴力...暴力求解啊,列举所有的可能。

    时间复杂度 O(n^2)  这里n为数组的长度
    空间复杂度 O(1)   只用的常数个临时变量

    public int[] twoSum(int[] nums,int target){
    int[] result = new int[2]; //创建一个result数组
    for(int i = 0;i<nums.length;i++){ //两层循环暴力枚举求解
    for(int j = i+1;j<nums.length;j++){
    if(nums[i] + nums[j] == target){ //判断是否符合题目要求
    result[0] = i;
    result[1] = j;
    }
    }
    }
    return result; //返回数组
    }

     but...参考别人真正的算法时才明白自己是个超级小丑。。。。。

    思路二:因为方法一的寻找时间复杂度过高,利用HashMap查找时间复杂度为O(1)。利用查找表法,在遍历的同时记录,以空间换时间。

         例如数组中的值为{2,6,9} target=11 则开始执行map.put(nums[0],0) 此时map值为{[2,0]}(key为nums[i]的值,value为值得下标),

         第二步执行判断语句target-nums[1] = 5,不存在即存入map中,此时map值为{[2,0],[6,1]}

         第三步执行判断语句target-nums[2] = 2,此时map中存在key=2的,故赋值给result然后跳出,完成

    时间复杂度:O(n) n为数组的长度,每次需要O(1)次寻找,所以总的时间复杂度为O(n)

    空间复杂度:O(n) n为数组的长度,主要是HashMap的开销

    public int[] twoSum2(int[] nums, int target) {
    int[] result = new int[2]; //创建一个结果数组
    HashMap<Integer, Integer> map = new HashMap<>(); //创建一个HashMap表
    map.put(nums[0], 0); //因为数组的第一个值一定没有与之相同的值
    for (int i = 1; i < nums.length; i++) {
    if (map.containsKey(target - nums[i])) {
    result[0] = i;
    result[1] = map.get(target - nums[i]);
    break; //找到对应值立即跳出循环(题目已知有且只有一对正确答案)
    }
    map.put(nums[i], i); //只要没找到,就一直put哈希表中
    }
    return result;
    }

                                                 2021-05-24

    -

  • 相关阅读:
    C++内存管理
    多线程和多进程的区别(C++)
    如何用C语言封装 C++的类,在 C里面使用
    C/C++将一个整型数组拼接成一个字符串
    C代码中如何调用C++ C++中如何调用C
    Application对象的使用-数据传递以及内存泄漏
    《鸟哥的Linux私房菜》读书笔记二
    《鸟哥的Linux私房菜》读书笔记一
    greenDaoMaster的学习研究
    Handler 引起的内存泄露
  • 原文地址:https://www.cnblogs.com/liuhuaabcp/p/14806397.html
Copyright © 2011-2022 走看看