这类题目归结于常用技巧与算法,有很鲜明的套路,重在理解其规则,通常写起来不算太复杂。
题目描述:
题目大意:
给出N个正整数和一个整数M,在N个正整数中找出两个数之和恰好等于整数M的值,输出这两个整数,如果不存在这样的数,则输出“No Solution”。
大致思路:
如果使用暴力的方法,时间复杂度为n^2,n的取值可以达到10的5次方,时间复杂度将会达到10的10次方,肯定会超出时间的限制,如果使用二分法的话将会使时间复杂度大大降低。
提交结果如下:
有一个测试用例未通过,放在第二轮刷题时解决。
提交代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, m;
vector<int> arr;
void func(int i, int &j);
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
arr.push_back(temp);
}
sort(arr.begin(), arr.end());
int i;
for (i =0 ; i < n; i++)
{
int j;
func(i, j);
if (arr[i] + arr[j] == m && i != j)
{
cout << arr[i] << " " << arr[j] << endl;
break;
}
}
if (i == n)
{
cout << "No Solution" << endl;
}
}
void func(int i, int& j)
{
int low = i;
int high = n - 1;
while (low < high)
{
int mid = (low + high) / 2;
if (arr[i] + arr[mid] >= m)
high = mid;
else
low = mid + 1;
}
j = low;
}
本次提交后累计得分424,排名为15867。