hackerrank\Algorithms\Search\Pairs

本文介绍了解决 Hackerrank 上 Pairs 问题的一种方法。通过使用数组记录元素出现的位置,该算法可以在 O(n) 时间复杂度内找出数组中差为 k 的元素对数量。适用于竞赛编程和算法面试。

问题描述:   https://www.hackerrank.com/challenges/pairs

基本思路描述:

 

 

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
    static int pairs(int[] a,int k) {
        int c = 0;
        int min = a[0];
        for(int i = 0;  i < a.length; i++) {
            if(min>a[i]) min=a[i];
        }
        int max = a[0];
        for(int i = 0;  i < a.length; i++) {
            if(max<a[i]) max=a[i];
        }
        int[] ak = new int[a.length];
        int[] sk = new int[a.length];
        byte[] f = new byte[max-min+1];//min as 0
        for(int i = 0;  i < a.length; i++) {
            ak[i] = a[i]+k;
            sk[i] = a[i]-k;
        }
        for(int i = 0;  i < a.length; i++) {
            f[a[i] - min  ] = 1;
        }
        for(int i = 0;  i < ak.length; i++) {
            if(ak[i] - min >=0&&ak[i] - min <f.length&&  f[ak[i] - min ] >=1) {
//                f[ak[i] - min ] ++;
                c++;
            }
        }
        for(int i = 0;  i < sk.length; i++) {
            if(sk[i] - min >=0&&sk[i] - min <f.length&&  f[sk[i] - min ] >=1) {
//                f[sk[i] - min ]++;
                c++;
            }
        }



        return c/2;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int res;
        
        String n = in.nextLine();
        String[] n_split = n.split(" ");
        
        int _a_size = Integer.parseInt(n_split[0]);
        int _k = Integer.parseInt(n_split[1]);
        
        int[] _a = new int[_a_size];
        int _a_item;
        String next = in.nextLine();
        String[] next_split = next.split(" ");
        
        for(int _a_i = 0; _a_i < _a_size; _a_i++) {
            _a_item = Integer.parseInt(next_split[_a_i]);
            _a[_a_i] = _a_item;
        }
        
        res = pairs(_a,_k);
        System.out.println(res);
    }
}

https://github.com/proooogram/research/tree/master/hackerrank/Algorithms/Search/Pairs

转载于:https://www.cnblogs.com/proooogram/p/6890069.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值