LeetCode - 1 - 两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路一(全暴力)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int ans1 = 0,ans2 = 0;
int l = nums.size();
for(int i = 0;i < l; i++)
{
int temp = nums[i];
int dert = target - temp;
int p = find(nums.begin(),nums.end(),dert) - nums.begin();
if(p != l)
{
if(p == i)
continue;
ans1 = min(p,i);
ans2 = max(p,i);
break;
}
}
vector<int> ans;
ans.push_back(ans1);
ans.push_back(ans2);
return ans;
}
};
LeetCode测试耗时140ms;
思路二(遍历同时存一下表)
static auto __=[]
{
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
return nullptr;
}();
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> m;
for (int i = 0; i < nums.size(); ++i) {
if (m.count(target - nums[i])) {
return {i, m[target - nums[i]]};
}
m[nums[i]] = i;
}
return {};
}
};
LeetCode耗时:4ms!
m 是遍历过得数字i的出现的位置,下次用到的时候,直接查找是否存在过这个数字就好了。