建设网站项目的目的是什么意思,做母婴用品的网站有哪些,环球资源网怎么找客户,wordpress 页面别名参见官方题解
一、学到的知识 正面寻找两个数之和相加等于某个数#xff0c;如 ab c#xff0c;不如反过来寻找 a c - b 正面寻找需要两层 for 循环#xff0c;把每个数都进行遍历#xff0c;所以时间复杂度较高 反过来则可以通过维护一个 a 的集合#xff0c;每次通过…参见官方题解
一、学到的知识 正面寻找两个数之和相加等于某个数如 ab c不如反过来寻找 a c - b 正面寻找需要两层 for 循环把每个数都进行遍历所以时间复杂度较高 反过来则可以通过维护一个 a 的集合每次通过查询 c - b 是否在集合中判断是否存在 a c - b 存在则返回答案不存在则将 a 插入集合中 待下次查询 想一下我们为什么把 a 插入集合中而不是 c - b呢 如果把 c - b 插入集合意味着我们将判断 a 是否在集合中总之就是要判断是否存在 a c - b两者写法其实都可以
二、代码 版本1 时间复杂度 O(N) 空间复杂度 O(1) 比较好想到的一个方法是先使用一层 for 循环枚举 a再使用一层 for 循环枚举 b判断 a b c 是否为真即可 而且也容易想到一点优化对于位于 x 位置的元素1…x-1次循环的时候nums[x]已经被匹配过所以无需再匹配所以在代码中可以看到第二层枚举 b 的循环从 i 1 开始 class Solution
{
public:vectorint twoSum(vectorint nums, int target){const int Size nums.size();for (int i 0; i Size; i){for (int j i 1; j Size; j){if (nums[i] nums[j] target){return {i, j};}}}return {0, 0};}
};版本2 时间复杂度 O(NlogN) 空间复杂度 O(N) 这是版本1的优化 前文提过需要寻找 a b c我们可以把 b 移至右侧寻找 a c - b我们很自然的想到可以维护一个数的集合再从中寻找元素是否存在 而这个集合的查找的复杂度就决定了我们算法的复杂度在代码中我们使用了标准库中的 map它的查找效率是 LogN class Solution
{
public:std::vectorint twoSum(std::vectorint nums, int target){const int size nums.size();mapint, int Map;for (int i 0; i size; i){const int gap target - nums[i];auto iterator Map.find(gap);if (iterator ! Map.end()){return {iterator-second, i};}Map.insert({nums[i], i});}return {-1, -1};}
};