leetcode 1 两数之和
Posted mrwho1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 1 两数之和相关的知识,希望对你有一定的参考价值。
题目
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路
1、最简单做法,遍历所有情况,复杂度O(n2)
2、先排序,头尾加两个指针,向中间移动,若指针和小于target,则尾指针前移,若指针和大于target,则头指针后移,复杂度取决于排序算法,最快O(nlogn)
3、不排序,用hash存每个数出现的次数,第一次遍历找出num1,判断条件是target-num1存在且不为同一个num1,如:(3,2,4),target为6,num1为3,target-num1也为3,同一个3就不行。但是如:(3,3),target为6,则num1的3和target-num1的3不为同一个,即可;第二次遍历,找出target-num1的位置,若遇到num1直接跳过,避免重复的情况发生(题目要求同样元素不能重复利用)。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,len = nums.size();
map<int, int> mark;
mark.clear();
for(i=0; i<len; ++i) {
mark[nums[i]] ++;
}
int le, ri;
for(i=0; i<len; ++i) {
mark[nums[i]] --;
if(mark[target - nums[i]]) {
le = i;
break;
}
mark[nums[i]] ++;
}
for(i=0; i<len; ++i) {
if(i == le) continue;
if(nums[i] == target-nums[le]) {
ri = i;
break;
}
}
vector<int> v;
v.push_back(le);
v.push_back(ri);
return v;
}
};
以上是关于leetcode 1 两数之和的主要内容,如果未能解决你的问题,请参考以下文章