N个整数中,在所有大于等于K的两个数的差中,找出最小的差(双指针优化)

先介绍一下暴力枚举,有的时候我们要对一个数组进行i和j的双重循环枚举:

     

当i=0时,j要从下标1遍历到5。时间复杂度为O(N^2)

双指针的思路是什么呢?就是j下标并不需要从i+1开始重新向后枚举一遍,而是随着i向后移动,j也向后移动。

      

从图中我们可以看到j一直是往右走,不会出现往左移动,当然前提的保证数组是有序的,这样的时间复杂度为O(N)

/*
   给定N个整数A1,A2.....An,以及一个正整数K,问在所有的大于等于K的两个数的差(Ai-Aj)中,最小的差是多少。
   数据范围 n<=100000

   思路:
        1.首先对数组排序
	2.枚举两个数中的较小的是A[i],较大的是A[j],也就是最小的A[j]-A[i]>=k
*/

#include <iostream>
#include <algorithm>
using namespace std;
int n, k, ans;
#define MAX 100000
int a[MAX];
int main()
{
	cin >> n >> k;
	for (int i = 0; i < n;i++)
	{
		cin >> a[i];
	}
	sort(a,a+n);
	if (a[n - 1] - a[0]<k)
	{
		cout << "no solution" << endl;
                return 0;
        }
	ans = a[n - 1] - a[0];       //求出最大值

	for (int i = 0,j=0; i < n;i++)
	{
		while (j < n && a[j] - a[i] < k) j++;
		if (a[j]-a[i]>=k && a[j]-a[i]<ans)
		{
			ans = a[j] - a[i];
		}
	}
	cout << ans << endl;
	return 0;
}


















猜你喜欢

转载自blog.csdn.net/m0_37806112/article/details/80663176