企业门户网站建设的意义,Wordpress托管 点点,企业整体形象设计,徐州信息港两数之和原题地址
方法一#xff1a;暴力枚举
首先#xff0c;我们需要枚举数组中所有可能的下标对组合#xff0c;对于 n 个数的数组#xff0c;从中选两个下标#xff0c;有 种可能。做法很简单#xff0c;遍历数组中的所有元素#xff0c;对于每一个元素#xff…两数之和原题地址
方法一暴力枚举
首先我们需要枚举数组中所有可能的下标对组合对于 n 个数的数组从中选两个下标有 种可能。做法很简单遍历数组中的所有元素对于每一个元素遍历该元素后面的所有元素即可。
比如对于 4 个元素的数组下标是 0~3 所有可能的组合就是(0,1),(0,2),(0,3),(1,2),(1,3),(2,3) 总共有 种可能。
0 1 2 3
^ ^
^ ^
^ ^^ ^^ ^^ ^ // 方法一暴力枚举
class Solution
{
public:vectorint twoSum(vectorint nums, int target){// 暴力枚举for (int i 0; i nums.size() - 1; i){for (int j i 1; j nums.size(); j){if (nums[i] nums[j] target){return { i,j };}}}return {};}
};
方法二哈希表
暴力枚举的方法时间效率太低了最坏的情况要把任意两个数都匹配一次。我们可以考虑把数组中的元素都存储到哈希表中遍历数组中的元素查找哈希表中是否有元素和数组中的元素匹配。
再具体一点对于数组中的某一个元素如果哈希表中有与之匹配的元素就找到了符合题目要求的答案如果没有元素与之匹配就把这个元素存储在哈希表中。这样的话对于数组中的每一个元素只需要 O(1) 的时间复杂度就能匹配完效率大大提升了。
C 中需要使用 unordered_map 而不是 unordered_set 因为最终要返回的是数组的下标所以要把数组的元素和对应的下标都存储到哈希表中。
// 方法二哈希表
class Solution
{
public:vectorint twoSum(vectorint nums, int target){unordered_mapint, int um;for (int i 0; i nums.size(); i){// 哈希表中有元素与之匹配auto it um.find(target - nums[i]);if (it ! um.end()){return { i, it-second };}// 存入哈希表um[nums[i]] i;}return {};}
};