Python HackerRank 刷题 Pairs

题目地址: https://www.hackerrank.com/challenges/pairs/problem?isFullScreen=false

翻译:返回list中任意两元素差值绝对值=k的最大组合数。例子如下:

难度:Medium

解题

正常做法:先输出全部长度为2的组合,再遍历两两求差比较。

from itertools import combinations

def pairs(k, a):
    # Write your code here
    temp = [i for i in combinations(arr, 2)]
    r = [ 1 if abs(i[0] - i[1]) == k else 0 for i in temp]
    return sum(r)

耗时严重无法通过全部case。换个思路,先排序,然后两个指针遍历两两组合,当差值≥k的时候break,并且计数+1。

def pairs(k, a):
    # Write your code here
    ct = 0
    a.sort()
    for i in range(len(a) - 1):
        for j in range(0, len(a)):
            if a[j] - a[i] > k:
                break
            elif a[j] - a[i] == k:
                ct += 1
                break
    return ct

通过了一部分case,仍然有部分无法通过。再进一步优化,充分利用排序后的数组,当差值=k时,break之后 j 没必要再从0开始遍历。

def pairs(k, a):
    # Write your code here
    ct = 0
    a.sort()
    st = 1
    for i in range(len(a) -1 ):
        for j in range(st, len(a)):
            if a[j] - a[i] > k:
                break
            elif a[j] - a[i] == k:
                ct += 1
                st = j+1
                break
    return ct
   

搞定完事。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值