您的位置:首页 > 文旅 > 美景 > 小米发布会2024_广州市企业网站建设怎么样_网站关键词推广工具_刷百度指数

小米发布会2024_广州市企业网站建设怎么样_网站关键词推广工具_刷百度指数

2024/12/23 7:32:36 来源:https://blog.csdn.net/qq_37945670/article/details/142925970  浏览:    关键词:小米发布会2024_广州市企业网站建设怎么样_网站关键词推广工具_刷百度指数
小米发布会2024_广州市企业网站建设怎么样_网站关键词推广工具_刷百度指数

题目链接:https://leetcode.cn/problems/two-sum/

方法一

方法一是最简单了,也是最容易想到的,既然给一个目标值再给一堆数字,那么我们就使用暴力枚举的方式,一个个试到底是哪两个数的和为目标值,如果找到了直接return就好了

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ans;for (int i = 0; i < nums.size(); ++i){for (int k = i + 1; k < nums.size(); ++k){if (nums[i] + nums[k] == target){ans.push_back(i);ans.push_back(k);return ans;}}}return ans;}
};

时间复杂度方面,外层循环会执行n次(n为数组长度),而内层循环会从k = i + 1执行到n,随着i增加,内层循环次数减少,但平均来说,内存循环执行次数约为n/2,因此整个算法的时间复杂度为双重循环的成绩,则为O(n ^ 2)

空间复杂度方面,结果ans固定返回长度为2的数组,不随着输入规模而变化,因此复杂度为O(1)

方法二

方式二我们可以通过哈希表来实现,我们每次在循环的时候先计算target - x[i],判断哈希表中是否有这个值,如果存在这个值则返回其索引即可,这样的实现复杂度由于只需要对每个数访问一次,最坏的情况下时间复杂度是O(N)

class Solution
{
public:vector<int> twoSum(vector<int>& nums, int target){// mapunordered_map<int, int> map;// 遍历每一个元素for (int i = 0; i < nums.size(); ++i){// 通过map查找有没有bauto m = map.find(target - nums[i]);// 如果返回的不是end则代表找到了if (m != map.end()){return {m->second, i};}map[nums[i]] = i;}}
};

空间复杂度方面,由于我们使用map来存储中间数,在最坏的情况下可能存储n个,因此空间复杂度为O(N)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com