题目
Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
题目解析
题目非常好懂,简单的说就是给你一个int数组,再给你一个数字sum,找到int数组中两个数,加起来等于sum。返回这两个数的坐标
方法一,暴力循环。尝试了,结果超时。
方法二,先排序,比如【2,11,7,4,15】,排序后为【2,4,7,11,15】,用sum减,比如sum为9,则为【7,5,2,-2,-6】
用一个i从前往后扫描,j从后往前扫描。我们的目标是从两个数组中找到一样的数字。i对应的数字比j对应的小了,i++,i对应的数字比j大了,则j--。
找到之后在用一个循环来找到他们原来的坐标即可,必须考虑两个数字相同的情况。
我的代码如下:
vector<int> twoSum_1(vector<int>& nums, int target)
{
vector<int> v(nums);
sort(v.begin(),v.end());
int i = 0,j = v.size()-1;
vector<int> ret;
while(i<j)
{
if (v.at(i)<target-v.at(j))
i++;
else if(v.at(i)>target-v.at(j))
j--;
else
break;
}
int ret1,ret2;
for (int k = 0 ;k<v.size();k++)
{
if (nums.at(k) == v.at(i))
ret1 = k;
}
for (int k = 0 ;k<v.size();k++)
{
if (nums.at(k) == v.at(j) || k!=ret1)
ret2 = k;
}
ret.push_back(min(ret1,ret2)+1);
ret.push_back(max(ret1,ret2)+1);
return ret;
}
一定要学会使用sort,经常用到。
我的代码里找回原来下标的方法复杂了,只要保证下标按顺序赋值就好了。可以参考下面的代码。
3 vector<int> twoSum(vector<int> &numbers, int target)
4 {
5 vector<int> v(numbers);
6 sort(v.begin(),v.end());
7
8 int l = 0, r = v.size() - 1;
9 while(l < r)
10 {
11 if(v[l] + v[r] == target)
12 break;
13 else if(v[l] + v[r] > target)
14 -- r;
15 else
16 ++ l;
17 }
18
19 vector<int> index;
20 for(int i = 0, n = 2; i < numbers.size(); ++ i)
21 if(v[l] == numbers[i] || v[r] == numbers[i])
22 {
23 index.push_back(i + 1);
24 if(-- n == 0)
25 break;
26 }
27
28 return index;
29 }
一种更简单的方式是使用hash表。
vector<int> twoSum_1(vector<int>& nums, int target)
{
unordered_map<int,int> mapping;
vector<int> ret;
for (int i = 0;i<nums.size();i++)
{
mapping[nums[i]] = i;
}
for (int i = 0;i<nums.size();i++)
{
const int gap = target - nums[i];
if (mapping.find(target) != mapping.end() && mapping[gap] > i)
{
ret.push_back(i+1);
ret.push_back(mapping[gap]+1);
break;
}
}
return ret;
}
Unordered Map是无序的哈希表,如果不需要对哈希表进行排序,可以使用无序的,效率更高。
1 头文件
#include<map>2 定义
map<string,int> my_Map;
或者是typedef map<string,int> MY_MAP;MY_MAP my_Map;
3 插入数据
(1) my_Map["a"] = 1;(2) my_Map.insert(map<string, int>::value_type("b",2));
(3) my_Map.insert(pair<string,int>("c",3));
(4) my_Map.insert(make_pair<string,int>("d",4));
4 查找数据和修改数据
(1) int i = my_Map["a"];my_Map["a"] = i;
(2) MY_MAP::iterator my_Itr;
my_Itr.find("b");
int j = my_Itr->second;
my_Itr->second = j;
不过注意,键本身是不能被修改的,除非删除。
5 删除数据
(1) my_Map.erase(my_Itr);(2) my_Map.erase("c");
还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。
6 迭代数据
for(my_Itr=my_Map.begin();my_Itr!=my_Map.end();++my_Itr){}7 其它方法
my_Map.size() 返回元素数目my_Map.empty() 判断是否为空
my_Map.clear() 清空所有元素
可以直接进行赋值和比较:=,>,>=,<,<=,!= 等等