LeetCode0001 两数之和
时间:2021-08-14
本文章向大家介绍LeetCode0001 两数之和,主要包括LeetCode0001 两数之和使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 问题描述
给定一个数组和一个数字,从数组中找到两个数的下标,这两个数的和等于给定的数字。假设有且只有一个结果;数组中同一个元素不能重复出现。
2 方法一 暴力求解
// 方法1:暴力求解 // 时间复杂度:O(n2) // 空间复杂度:O(1) public static int[] twoSum(int[] nums, int target){ int len = nums.length; for (int i = 0; i < len - 1; i++){ for (int j = i + 1; j < len; j++){ if ((nums[i] + nums[j]) == target){ return new int[]{i, j}; } } } throw new IllegalArgumentException("No two sum solution"); }
使用二重循环遍历数组中的每一个元素,如果两数之和等于target,则返回两个元素的下标。外层循环从0遍历至len-2(根据题意,外层循环不会遍历到最后一个元素);内层循环从i+1遍历到len-1。两层循环均与数组长度len相关,时间复杂度为O(n2);使用了3个变量(常数个),空间复杂度为O(1)。
3 方法三 查找表法(HashMap)
// 方法2:查找表法 // 时间复杂度:O(n) // 空间复杂度:O(n) public static int[] twoSum2(int[] nums, int target){ int len = nums.length; Map<Integer, Integer> hashMap = new HashMap<>(len); hashMap.put(nums[0], 0); for (int i = 1; i < len; i++){ int another = target - nums[i]; if (hashMap.containsKey(another)){ return new int[]{hashMap.get(another), i}; }else{ hashMap.put(nums[i], i); } } throw new IllegalArgumentException("No two sum solution"); }
创建HashMap,其中key存放数组值,value存放数组值对应的下标。首先将数组第一个元素存入哈希表中,从第二个元素开始遍历数组。如果target-当前元素的值==哈希表中已有的key,则找到匹配的两个值,返回当前元素的下标和哈希表中那个已有的key所对应的value;如果target-当前元素的值!=哈希表中已有的key,则将当前元素存入哈希表中。
使用了一次循环且循环与数组长度len相关,时间复杂度为O(n);哈希表长度与数组长度len相关,空间复杂度为O(n)。这是一种用空间换取时间的策略,提高了程序运行的速度。
原文地址:https://www.cnblogs.com/wangmengdx/p/15140629.html
- Docker系列教程12-使用Maven插件构建Docker镜像
- Linux nohup 用法
- 【LEETCODE】模拟面试-84-Largest Rectangle in Histogram
- Docker系列教程11-使用Nexus管理Docker镜像
- Mac 配置终端环境
- 【LEETCODE】模拟面试-101-Symmetric Tree
- Docker系列教程10-使用Docker Registry管理镜像
- webapp开发调试环境--weinre配置
- AWK 深入浅出教程
- Docker系列教程09-使用Docker Hub管理镜像
- C++11基础学习系列一
- 触屏touchstart 与 click
- Linux DNS之dig利器
- Docker系列教程08-Dockerfile实战
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于Pytorch实现的MASR中文语音识别
- Quartz.NET 配置文件详解
- 如何用redis正确实现分布式锁?
- SQL Server 事务隔离级别
- Django+Vue开发生鲜电商平台之8.商品详情页功能实现
- Django+Vue开发生鲜电商平台之7.用户登录和注册功能
- centos7下nginx使用tmp目录问题
- TeaWeb – 可视化的Web代理服务
- Slf4j适配日志原理
- vim编辑器
- 深度学习常用Linux命令
- Vlan 和 和 Trunk 实验
- koa框架生成微信公众号二维码
- KVM 实现虚拟机在线热迁移
- 机器重启后 docker 容器启动报错 error creating overlay mount t