两数之和(每天刷力扣hot100系列)

简介: 本题要求在数组中找出两数之和等于目标值的下标。解法一为暴力枚举,时间复杂度O(N²),空间复杂度O(1);解法二利用哈希表,将查找时间降为O(1),总时间复杂度O(N),空间复杂度O(N),实现以空间换时间的优化。


题目介绍:

解法1:暴力枚举
class Solution {
public:
vector twoSum(vector& nums, int target) {
int n = nums.size();
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
};
时间复杂度:O(N2)

空间复杂度:O(1)

这个就是穷举,没什么好解释的

解法2:哈希表(散列表)
class Solution {
public:
vector twoSum(vector& nums, int target) {
unordered_map hashtable;
for (int i = 0; i < nums.size(); ++i) {
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {
return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};
}
};

时间复杂度:O(N)

空间复杂度:O(N)

哈希表的原理就是空间换时间,提前创建固有的一定空间,如果空间无限大可以就直接定位到值所在的键,存放索引。由于空间有限,则可以通过取余存放到固定的位置,如果遇到哈希冲突,则顺延,查找的时候也是直接找想要找的值的索引处,取出数组的索引值。哈希桶则类似于链表,哈希冲突的时候就连在原先的索引值后面。(负载因子为存放的数据占总空间的大小,涉及到扩容)。

在这里就是创建一个基于哈希表的键值对容器unordered_map,然后遍历一遍数组,遍历规则是找对应x数的target-x的数值,在创建的哈希表里面找,如果找到了,则返回对应键的数组索引值,找不到则将其索引值根据数值存入对应键处,好拿好取。如果没有则返回空。

相关文章
|
4月前
|
存储 C++ 索引
最长连续序列(每天刷力扣hot100系列)
本题使用哈希表法求最长连续序列。利用unordered_set存储去重元素,遍历集合时仅当num-1不存在时才作为起点向后扩展,统计连续长度,时间复杂度O(n),空间复杂度O(n)。相比unordered_map更高效,因无需存储值。
|
C++
Leetcode第一题(两数之和)
这篇文章介绍了解决LeetCode第一题“两数之和”的两种方法:暴力法和哈希表法,并提供了相应的C++代码实现。
337 0
Leetcode第一题(两数之和)
|
存储 C++ 容器
【LeetCode 13】1.两数之和
【LeetCode 13】1.两数之和
121 0
|
存储 索引
LeetCode------两数之和(3)【数组】
这篇文章介绍了LeetCode上的"两数之和"问题,提供了两种解法:一种是暴力求解法,通过双层循环遍历数组元素对查找两数之和为目标值的索引,时间复杂度为O(n^2);另一种是使用HashMap优化,通过存储元素值和索引,时间复杂度降低到O(n)。
LeetCode------两数之和(3)【数组】
|
存储 算法 索引
力扣经典150题第四十三题:两数之和
力扣经典150题第四十三题:两数之和
119 1
|
算法 测试技术 程序员
力扣经典150题第二十七题:两数之和 II - 输入有序数组
力扣经典150题第二十七题:两数之和 II - 输入有序数组
172 1
LeetCode第1题两数之和
该文章介绍了 LeetCode 第 1 题两数之和的解法,通过使用 HashMap 来记录数组元素及其下标,以 O(n)的时间复杂度解决问题。
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
JavaScript 前端开发 PHP
leetcode——两数之和【一】
leetcode——两数之和【一】
147 0