1.可以快排,然后遍历一遍排完序后的数组。时间复杂度为O(NlogN+N)。
2.先遍历一遍数组a[ ],找出最大值max和最小值min。然后以建立一个(max+min-1)大小的数组b[ ],再次遍历原始数组,b[a[i]-min]++,试图建立一种映射关系,降低时间复杂度。代码如下:
#include <iostream> //#include <bitset> using namespace std; int findMinDiff(int a[], int len) { int min=INT_MAX, max=INT_MIN; int i; for (i = 0; i < len; i++) { if (a[i]<min) { min=a[i]; } if (a[i]>max) { max=a[i]; } } int N = max-min+1; int* res = new int[N]; memset(res, 0, N*sizeof(int)); for (i = 0; i < len; i++) { res[a[i]-min]++; } int first, minDiff = INT_MAX; /* for (i = 0; i < N; i++) { cout<<res[i]<<" "; }*/ cout<<endl; bool isflag = true; for (i = 0; i < N; i++) { if (res[i] >= 2) { return 0; } else if (res[i] == 1 && isflag) { first = i; isflag = false; } else if (res[i] == 1 && !isflag) { int temp = i - first; if (temp < minDiff) { minDiff = temp; } first = i; } } return minDiff; } int main() { int a[] = {-3, -5, 15, 23, 111, 10}; int len = sizeof(a)/sizeof(int); cout<<"the minimum diff is : "; cout<<findMinDiff(a, len)<<endl; }