c/c++实现 输入n个数字,然后找出其中两个数字相加后等于m------【排序算法的妙用】

在这里插入图片描述
基本思路:
最简单的暴力方法就是,两层循环一个一个试一遍相加后是否等于m,但是复杂度太高O(n^2)

思考是否可以遍历一遍就可以找出来呢?
可以预设一个开头标记、一个结尾标记,两个标记相互靠拢的方式,如果两个标记所指向的数字相加等于m 那么就找到了这两个数。
但是,如何靠拢呢?
如果是同步的靠拢,会漏掉很多情况,可能会得到正确结果,但程序也是不可靠的。
如果是不同步的靠拢,那么两个标记需要按照规则方式进行不同的移动,但是当前n个数字是乱序的,没有什么好的判断规则,因为你不知道换成下一个数的时候是大了还是小了,就会退化为上面说的暴力方法。我们可以使用常用的技巧,就是对n个数先进行排序(就像二分查找法一样,需要先排序),n个数有了递增的特性,那么便可以借助这个特性,来思考判断规则:当前两个标记的数字和小于m,说明开头标记指向的数字太小了,开头标记要+1.同理,两个标记的数字和大于m,结尾标记要-1。这样的话,得到的时间复杂度就是排序的时间复杂度了O(n*log(n))

代码:

#include 
#include 
#include 
using namespace std;
int main() {
	int m ,n;
	int* number;
	int start, end;
	cout << "请输入一个数字n" << endl;
	cin >> n;
	number = new int[n];
	cout << "请输入"<> number[i];
	cout << "请输入一个数字m" << endl;
	cin >> m;
	// 排序
	sort(number,number+n);

	start = 0;
	end = n - 1;
	while (start <= end) {
		if (number[start]+number[end] m) {
			end--;
		}else{
			break;
		}
	}
	cout << number[start] << "+" << number[end] << "=" << m << endl;
	return 0;
}

效果:
c/c++实现 输入n个数字,然后找出其中两个数字相加后等于m------【排序算法的妙用】_第1张图片

你可能感兴趣的:(算法基础题集)