leetcode解题报告1. Two Sum
难度是easy
题目描述
给定一个整数数组和一个目标结果,找出数组里两个数,使得两个数的和是目标结果。每个数不能重复使用。保证有且只有一个解。
我的思路
暴力求解,嵌套遍历数组两遍,即可。
其中有一些细节可以优化。
我的代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int size = nums.size();
for (int i = 0; i < (size - 1); i++) {
int tt = target - nums[i]; //优化点,预先减,避免后面比较时的相加操作。
for (int j = i + 1; j < size; j++) {
if (nums[j] == tt) {
vector<int> ans;
ans.push_back(i);
ans.push_back(j);
return ans;
}
}
}
}
};
阅读官方题解
暴力求法的复杂度是
O(n2)
。 题解中提出了空间换时间的算法,把复杂度降到
O(n)
。具体是建立数列的哈希表,建立耗时
O(n)
,索引耗时
O(1)
。我们遍历一遍数组,每个数相对于目标结果,都有一个对应期望的数,即目标结果减去该数。在哈希表索引看在不在里面(注意不能是同一个数,因为不能重复使用),如果在且不是同一个数,则找到了结果。
此外,可以进一步优化,在建立哈希表的同时,遍历数组。
思想核心总结
在一个数列中找一个目标数,普通的遍历耗时
O(n)
,如果是已经有哈希表,则耗时降到
O(1)
。
在暴力算法中,我们需要多次在一个数列中找目标数,导致嵌套遍历,耗时
O(n2)
。我们可以先用
O(n)
耗时,建立哈希表,使得后面的在一个数列中找目标数变成
O(1)
,一劳永逸,进而优化。