解题过程的小记录,如有错误欢迎指出。
难度:一星(第三次做这道题了,这次是two pointers的做法)
题目分析
给出一组数,找出其中两个数为指定的数的方案
注意点
- 有多种解决方案时,输出两个数中小的数字更小的那一个
我的解题过程
思路
将数组从小到大进行排序,将两个指针i和j分别指向头尾
- 当所指向的两个数的和<指定数时,i向右移(j向左移只会更小)
- 当所指向的两个数的和>指定数时,j向左移(i向左移只会更大)
- 当正好相等时,结束循环
- 如果没有找到,循环结束时,i==j
bug
scanf里面忘写& 报错一次orz
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//two pointers写法
int main() {
int n, m;
cin >> n >> m;
vector<int> coins(n);
for (int i = 0; i < n; i++) {
scanf("%d", &coins[i]);
}
sort(coins.begin(), coins.end());
int i = 0, j = n - 1;
while (i < j) {
int s = coins[i] + coins[j];
if (s > m) j--;
else if (s < m) i++;
else break;
}
if (i == j) {
cout << "No Solution";
return 0;
}
cout << coins[i] << " " << coins[j];
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
- 需要找多个数时,将two pinters部分写成函数可以使代码更简洁