3.18~InsertionSort And Pairs
转载注明出处 http://www.cnblogs.com/ligun123/archive/2013/03/19/2969438.html
先是跟着Hackerrank练习了下插入排序
然后又做了Pairs,来源:https://www.hackerrank.com/challenges/pairs
Given N numbers [N<=10^5], count the total pairs of numbers that have a difference of K. [K>0 and K<1e9]. Each of the N numbers will be > 0 and be less than K away from 2^31-1 (Everything can be done with 32 bit integers).
Input Format:
1st line contains N & K (integers).
2nd line contains N numbers of the set. All the N numbers are assured to be distinct.
Output Format:
One integer saying the no of pairs of numbers that have a diff K.
Sample Input #00:
5 2
1 5 3 4 2
Sample Output #00:
3
Sample Input #01:
10 1
363374326 364147530 61825163 1073065718 1281246024 1399469912 428047635 491595254 879792181 1069262793
Sample Output #01:
0
一开始没读懂啥题,多了几遍才晓得,是计算有多少对这样的数,他们相差为K?
可以先将原来的数组从小到大排序,然后查找其中每一个值(arr[i] + K)是否在这个数组中,是的话pairs +1,最后打印pairs
// // main.c // InsertionSort & Pairs // // Created by Kira on 3/18/13. // Copyright (c) 2013 Kira. All rights reserved. // #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <assert.h> /* Head ends here */ void insertionSort(unsigned long int ar_size, unsigned long int * ar) { if (ar_size > 1) { insertionSort(ar_size-1, ar); } if (ar_size == 1) { return; } unsigned long int key = ar[ar_size-1]; for (long long int i = ar_size -2; i >= 0; i --) { if (key < ar[i]) { ar[i +1] = ar[i]; } else { ar[i +1] = key; break; } if (i ==0) { ar[i] = key; } } } int compare(const void *d1, const void *d2) { return *(int*)(d1) - *(int*)(d2); } /* Tail starts here */ int main() { unsigned long int N = 0, K = 0, *array = NULL; scanf("%ld", &N); scanf("%ld", &K); array = calloc(N, sizeof(unsigned long)); unsigned long int i = 0; while (i < N) { scanf("%ld", &array[i]); // insertionSort(i +1, array); //最开始用自己之前写的插入排序,结果时间复杂度不过关,然后替换成了系统的qsort i ++; } qsort(array, N, sizeof(unsigned long), compare); unsigned long int count = 0; for (int ii = 0; ii < N; ii ++) { unsigned long int key = array[ii] + K; unsigned long begin = ii +1; unsigned long end = N-1; while (begin <= end) { unsigned long int mid = (begin + end) /2; if (array[mid] < key) { begin = mid+1; } else if (array[mid] > key) { end = mid-1; } else if (array[mid] == key) { count ++; break; } } } free(array); array = NULL; printf("%ld", count); return 0; }