首页 > 编程语言 >力扣算法第1题--两数之和(暴力题解&优化题解)

力扣算法第1题--两数之和(暴力题解&优化题解)

时间:2022-09-27 00:14:16浏览次数:48  
标签:target nums -- 题解 哈希 int 数组 index2 两数

两数之和

题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力题解

 

public class Solution {
/**
* 两数之和,在数组中找到两个数,使得它们的和等于target,返回这两个数的下标(存于数组中返回)
*/
  public int[] twoSum(int[] nums, int target) {
    int index1 = -1, index2 = -1; // 可将答案1和答案2存在这两个变量中

 

    for(int i=0;i<nums.length;i++){
      for(int j=i+1;j<nums.length;j++){
        if(nums[i]+nums[j]==target){
          index1=i;
          index2=j;
          break;
        }
      }
    }

 

    int[] ans = { index1, index2 };
    return ans;
  }
}

  此常规算法运用两层for循环嵌套遍历,时间复杂度为O(n^2);

  此常规算法中定义了index1和index2两个变量,而数组是通过形参传入,所以空间复杂度为O(1)。

 

优化题解(思路来自我的算法课程老师)

 

import java.util.HashMap;

 

public class SolutionPlus {
/**
* 两数之和,在数组中找到两个数,使得它们的和等于target,返回这两个数的下标(存于数组中返回)
*/
  public int[] twoSum(int[] nums, int target) {
    int index1 = -1, index2 = -1; // 可将答案1和答案2存在这两个变量中

    //维护一个哈希表
    int value=0;
    HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
    for(int i=0;i<nums.length;i++){
      value=nums[i];//下标i数值a
      if(map.containsKey(target-value)){
        //map.put(nums[i],i);
        index1=i;//map.get(value)//只通过1个例子(第一版写的时候)
        index2=map.get(target-value);
        break;
      }
      else if(!map.containsKey(target-value)){
        map.put(nums[i],i);
      }
    }
    if(nums==null) return new int[0];
    int[] ans = { index1, index2 };
    return ans;
  }
}

  此优化算法用了一层for循环将数组元素加进哈希表map,再配合哈希表查询时花费O(1)的时间复杂度,使得优化算法的时间复杂度为O(n);

  此优化算法除了定义了index1和index2两个变量外,还定义了一个哈希表,哈希表的长度由形参传入的数组来决定,此处可理解其长度为n,所以优化算法的空间复杂度为O(n)。

 

思考:为什么优化算法的时间复杂度可以比常规解法更快?

 

  避免了两层循环嵌套的比对查询,哈希表是根据键而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度,理论上哈希表的时间效率为常数级别,即O(1)。

 

  每当在数组中找到一个数a,便把数a作为key及其对应下标作为value存进哈希表;当我们检索到b时,也能快速地从哈希表中查到a = target - b是否存在。这样我们只需要遍历一次数组。

 

--------------------------------------本文章的题解均为本人作答,无抄袭,题目来源于力扣平台。----------------------------------------

 

标签:target,nums,--,题解,哈希,int,数组,index2,两数
From: https://www.cnblogs.com/hngz/p/16733042.html

相关文章

  • 整型细节
    1、java各整数类型有固定的的范围和字段长度,不受具体OS影响,以保证java程序的可移植性2、java的整型常量默认为int型,声明long型常量必须加“l”或“L”3、java程序中变量......
  • 开源动态可监控线程池DynamicTp介绍
    前言使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢?代码中创建了一个ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适凭经验设置参数值,上......
  • 实验2:Open vSwitch虚拟交换机实践
    一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中......
  • 1015. 摘花生
    https://www.acwing.com/problem/content/description/1017/#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>usingnamespacestd;consti......
  • 应用内存管理:Linux的应用与内存管理
    应用程序想要使用内存,必须得找操作系统申请,那就有必要先了解下Linux内核怎么管理内存的,然后再去分析应用程序的内存管理细节。硬件架构现代计算机体系结构被称为Non-Unif......
  • 实验2:Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的1.能够对OpenvSwitch进行基本操作;2.能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;3.能够通过Mininet的......
  • 时间处理函数
    golang//格式化时间t1:=time.Now().Format("2006-01-0215:04:05")Nodejs//时间格式化constmoment=require('moment')//区分大小写moment().format("YYYY-......
  • 两个和最大的区间(线段树+单调栈+dp)
      胜哥投喂的一道面试题  题意:有一个环形数组\(a\),找出两个不重叠的子串,是的这两个区间内所有的数加起来的和最大。  数据范围:\(1\leqn\leq10^5,\left|......
  • 随记
    linuxtree文件树pkill-9xxxx根据名字杀死进程可加快解析速度的配置:vim/etc/resolv.conf#阿里dns解析nameserver223.5.5.5nameserver223.5.5.5`````......
  • Python源码剖析 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/12DltvfQr4Tc7ZwhiG1UmAg点击这里获取提取码 ......