和为S的两个数字
来源:互联网 发布:淘宝上怎么添加旺旺 编辑:程序博客网 时间:2024/05/22 15:22
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
我觉得这道题自己应该记录一下,避免以后犯同样的错误。这道题第一次我思路是将每一个符合要求的先用pair装入vector中,代码比较多,在VS上测试用例是通过了的,但是提交的时候说段错误。
代码如下:
C++ Code
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
vector<int> FindNumbersWithSum(vector<int> array, int sum)
{
vector<int> res;
vector<pair<int, int> > vec;
if (array.size() == 0)
return res;
int Msum = 0;
int start = 0, end = array.size() - 1;
while (start < end)
{
if (array[start] + array[end] == sum)
{
vec.push_back(make_pair(array[start] , array[end]));
end--;
}
else if ((array[start] + array[end] > sum) && start < end)
{
end--;
}
else if ((array[start] + array[end] < sum) && start < end)
{
start++;
}
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
if (vec.size() <= 1)
{
res.push_back(vec[0].first);
res.push_back(vec[0].second);
return res;
}
res.push_back(vec[0].first);
res.push_back(vec[0].second);
for (int i = 1; i < vec.size(); i++)
{
if (vec[i].first * vec[i].second >= res[0] * res[1])
continue;
else
{
res.clear();
res.push_back(vec[i].first);
res.push_back(vec[i].second);
}
}
return res;
}
{
vector<int> res;
vector<pair<int, int> > vec;
if (array.size() == 0)
return res;
int Msum = 0;
int start = 0, end = array.size() - 1;
while (start < end)
{
if (array[start] + array[end] == sum)
{
vec.push_back(make_pair(array[start] , array[end]));
end--;
}
else if ((array[start] + array[end] > sum) && start < end)
{
end--;
}
else if ((array[start] + array[end] < sum) && start < end)
{
start++;
}
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
if (vec.size() <= 1)
{
res.push_back(vec[0].first);
res.push_back(vec[0].second);
return res;
}
res.push_back(vec[0].first);
res.push_back(vec[0].second);
for (int i = 1; i < vec.size(); i++)
{
if (vec[i].first * vec[i].second >= res[0] * res[1])
continue;
else
{
res.clear();
res.push_back(vec[i].first);
res.push_back(vec[i].second);
}
}
return res;
}
后面省去了用pair,在开始的时候判断res容器是不是为空,不是的话就判断现在即将压入的数与之前存在于容器内的数的乘积大小,直到遍历完毕。
C++ Code
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//超时代码
vector<int> FindNumbersWithSum(vector<int> array, int sum)
{
vector<int> res;
if (array.size() == 0)
return res;
int start = 0, end = array.size() - 1;
long long s = 0;
while (start < end)
{
long long Msum = array[start] + array[end];
if (Msum == sum)
{
if (res.size() == 0)
{
res.push_back(array[start]);
res.push_back(array[end]);
s = array[start] * array[end];
}
else if (res.size() != 0 && array[start] * array[end] > s)
continue;
else if (res.size() != 0 && array[start] * array[end] < s)
{
res.clear();
res.push_back(array[start]);
res.push_back(array[end]);
s = array[start] * array[end];
}
end--;
}
else if ((Msum > sum) && start < end)
{
end--;
}
else if ((array[start] + array[end] < sum) && start < end)
{
start++;
}
}
return res;
}
vector<int> FindNumbersWithSum(vector<int> array, int sum)
{
vector<int> res;
if (array.size() == 0)
return res;
int start = 0, end = array.size() - 1;
long long s = 0;
while (start < end)
{
long long Msum = array[start] + array[end];
if (Msum == sum)
{
if (res.size() == 0)
{
res.push_back(array[start]);
res.push_back(array[end]);
s = array[start] * array[end];
}
else if (res.size() != 0 && array[start] * array[end] > s)
continue;
else if (res.size() != 0 && array[start] * array[end] < s)
{
res.clear();
res.push_back(array[start]);
res.push_back(array[end]);
s = array[start] * array[end];
}
end--;
}
else if ((Msum > sum) && start < end)
{
end--;
}
else if ((array[start] + array[end] < sum) && start < end)
{
start++;
}
}
return res;
}
代码超时。。。
冷静下来仔细想了一下,这是一个递增排序的数组,其实只要最前面和最后面出现的数字一旦相加为sum,出现的第一对一定是乘积最小的。
修改代码如下:
C++ Code
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
vector<int> FindNumbersWithSum(vector<int> array, int sum)
{
vector<int> res;
if (array.size() == 0)
return res;
int start = 0, end = array.size() - 1;
while (start < end)
{
long long Msum = array[start] + array[end];
long long s = 0;
if (Msum == sum)
{
res.push_back(array[start]);
res.push_back(array[end]);
break;
}
else if ((Msum > sum) && start < end)
{
end--;
}
else if ((array[start] + array[end] < sum) && start < end)
{
start++;
}
}
return res;
}
{
vector<int> res;
if (array.size() == 0)
return res;
int start = 0, end = array.size() - 1;
while (start < end)
{
long long Msum = array[start] + array[end];
long long s = 0;
if (Msum == sum)
{
res.push_back(array[start]);
res.push_back(array[end]);
break;
}
else if ((Msum > sum) && start < end)
{
end--;
}
else if ((array[start] + array[end] < sum) && start < end)
{
start++;
}
}
return res;
}
准确通过。下次一定记得不要着急,仔细分析题目。
阅读全文
0 0
- 和为S的两个数字
- 和为S的两个数字
- 找出和为S的两个数字
- 和为S的两个数字
- 【5】和为s的两个数字
- 和为S的两个数字
- 和为s的两个数字
- 和为s的两个数字
- 和为S的两个数字
- 和为S的两个数字
- 和为S的两个数字
- 和为s的两个数字
- 和为s的两个数字
- 牛客网 | 和为S的两个数字
- 和为s的两个数字
- 和为S的两个数字
- 和为S的两个数字
- 和为S的两个数字
- 图解电容充放电
- 当前时代信息收集技巧初步总结
- 移动端 滑屏
- 两小时一个Java小项目---TelBook
- 仿真软件Udacity Self-Driving Car Simulator
- 和为S的两个数字
- 欢迎使用CSDN-markdown编辑器
- Memcached缓存服务器安装部署
- 网易校招第7题
- error:chrome控制台警告:Synchronous XMLHttpRequest on the main thread...
- QWidget类
- storm教程(一):storm基本概念和集群架构
- 1021. 个位数统计 (15)
- ANDROID 大图片裁剪终极解决方案