标签:map target nums int 复杂度 vector 两数
题目:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
作为leetcode的第一题,这道题显然是有暴力方法的,那就是双重循环遍历,代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// cout<<"hello";
vector<int> res;
int a,b;
int length=nums.size();
for(int i=0;i<length;i++)
{
for(int j=i+1;j<length;j++)
{
if(nums[i]+nums[j]==target)
{
res.push_back(i);
res.push_back(j);
}
}
}
return res;
}
};
但是显然,时间负责度为n^2,运行时间很长,有没有什么好的办法呢?
我想到的办法是,查找第一个值时需要遍历,时间复杂度为n,查找第二个如果也遍历,时间复杂度为n,则总的为n^2,但是如果查找第二个时为logn或者1时,就可以减少时间复杂度。
map刚好可以实现logn,把nums数组的值作为map的key,索引作为map的value,依次插入到map中,由于map插入时会实现自动排序,则可以在遍历第一个数的时候,用map.find函数来查找第二个数,以此形成的时间复杂度为n*logn,会减少一部分时间,代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> temp;
vector<int> res;
for(int i=0;i<nums.size();i++)
temp.insert(make_pair(nums[i],i));
map<int ,int>::iterator it;
// for(it=temp.begin();it!=temp.end();it++){
// cout<<it->first<<" "<<it->second<<endl;
// }
for(int i=0;i<nums.size();i++)
{
int cha=target-nums[i];
it=temp.find(cha);
if(it->second==i)
continue;
// cout<<it->second<<endl;
if(it!=temp.end())
{
res.push_back(i);
res.push_back(it->second);
break;
}
}
return res;
}
};
至于复杂度为n的,暂时还没有想到
标签:map,target,nums,int,复杂度,vector,两数 来源: https://blog.csdn.net/weixin_43098069/article/details/121727474
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。