当前位置:网站首页>leetcode 第一题——两数之和
leetcode 第一题——两数之和
2022-06-21 10:45:00 【848698119】
两数之和
今天多一份拼搏、明天多几份欢笑
两数之和
https://leetcode.cn/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/
1. 题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
示例 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) 的算法吗?
2. 解题思路:
2.1 方法一:暴力枚举
2.1.1 思路及算法
最容易想到的方法是枚举数组中的两个数的和等于target。
每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。
2.1.2 代码
public static int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return new int[]{
i, j};
}
}
}
return null;
}
2.1.3 复杂度分析
- 时间复杂度:O(N²),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
- 空间复杂度:O(1)。
2.2 方法二:哈希表
2.2.1 思路及算法
注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。
使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N)O(N) 降低到 O(1)O(1)。
这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。
2.2.2 代码
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>(nums.length-1); //HashMap建议我们初始化的时候尽量指定其初始化容量,减少扩容次数
//HashMap<数组的值,对应的数组下标>
for (int i = 0; i < nums.length; ++i) {
if (hashtable.containsKey(target - nums[i])) {
//哈希表中的key是否包含target-nums[i]
return new int[]{
hashtable.get(target - nums[i]), i};
}
hashtable.put(nums[i], i);
}
return new int[0];
}
2.2.3复杂度分析
时间复杂度:O(N),其中N是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
空间复杂度:O(N),其中N 是数组中的元素数量。主要为哈希表的开销。
3. 查找表法
- 在遍历的同时,记录一些信息,以省去一层循环,这是“以空间换时间"的想法
- 需要记录已经遍历过的数值和它所对应的下标,可以借助查找表实现
- 查找表有两个常用的实现:
- 哈希表
- 平衡二叉搜索树
边栏推荐
- DSP online upgrade (4) -- functions implemented by bootloader
- 03. Redis actual battle: meeting goddess nearby by geo type
- Simple Android weather app (III) -- city management and database operation
- Detailed explanation of connection pool parameter settings (view while adjusting)
- 知识点滴 - 什么是加速移动网页(AMP)?
- is not allowed to connect to this mysql server
- Dapr advanced-01-debug dapr
- One line of code accelerates sklearn operations thousands of times
- Is it safe for Guojin securities to open an account?
- Matplotlib 绘制圆环图的两种方法!
猜你喜欢

DSP online upgrade (2) -- design framework of bootloader

香农的信息论究竟牛在哪里?

Haplotype analysis using shapeit

The backbone of the top 100 security companies! Meichuang technology was selected into the 2022 China top 100 Digital Security Report

为什么 C# 访问 null 字段会抛异常?
![触摸按键控制器TTP229-BSF使用心得[原创cnblogs.com/helesheng]](/img/2f/3594188c5e58d3501f76f4937a979c.png)
触摸按键控制器TTP229-BSF使用心得[原创cnblogs.com/helesheng]

Application configuration management, basic principle analysis

leetcode:715. Range 模块【无脑segmentTree】

2. MySQL index creation method and its optimization

程序員新人周一優化一行代碼,周三被勸退?
随机推荐
文旅新体验!3DCAT助力广州非遗“元宇宙”街区炫酷亮相
Port occupancy
MySQL - data type
A bit of knowledge - what is amp?
Mythical games announced its cooperation with kakao games, a leading Korean game publisher, to promote business expansion in the Asia Pacific Region
leetcode-94-二叉树的中序遍历
Coordinate system transformation, application in inertial navigation antenna
One line of code accelerates sklearn operations thousands of times
Use the spatial complexity of O (1) to flip the linked list
15+城市道路要素分割应用,用这一个分割模型就够了!
K-means introduction
Answers to mobile application development learning general test questions
Software architecture discussion
Use of jobservice
FastAPI Web框架 [Pydantic]
DSP online upgrade (4) -- functions implemented by bootloader
送分题,ArrayList 的扩容机制了解吗?
Huawei releases wireless innovative products and solutions to build 5gigaverse Society
leetcode:715. Range 模块【无脑segmentTree】
Dapr advanced -02- view dapr logs