zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    kolla-ansible安装openstack(Ocata)
    OpenStack 虚机网卡的创建过程
    C语言 IPv6 十六进制 转 十进制
    python IPv6 十进制和十六进制互转
    ICMPv6 Packet Types and Codes
    scapy IPv6 NS NA报文构造
    最接近的数 牛客网 程序员面试金典 C++ Python
    最近公共祖先 牛客网 程序员面试金典 C++ Python
    有向路径检查 牛客网 程序员面试金典 C++ Python
    检查是否是BST 牛客网 程序员面试金典 C++ java Python
  • 原文地址:https://www.cnblogs.com/ligun123/p/2969438.html
Copyright © 2011-2022 走看看