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

    -

  • 相关阅读:
    springboot使用war包部署到外部tomcat
    html只允许输入的数据校验,只允许输入字母汉字数字等
    转:执行ajax加载页面中的js
    php 解析xml 的四种方法(转)
    Php 获取xml中的节点值
    php中DOMDocument简单用法(XML创建、添加、删除、修改)
    PHP对XML文件操作详细
    转载 PHP 程序员学数据结构与算法之《栈》
    php读取二进制流(C语言结构体struct数据文件)的深入解析
    关于php和C语言接口的结构传递问题,udp,tcp通信
  • 原文地址:https://www.cnblogs.com/liuhuaabcp/p/14806397.html
Copyright © 2011-2022 走看看