前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比

2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比

作者头像
福大大架构师每日一题
发布2021-08-05 16:12:13
3720
发布2021-08-05 16:12:13
举报

2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛。一局比赛只有两个人,返回最多可以同时有多少场比赛。

福大大 答案2021-06-23:

时间紧,思路见代码。

代码用golang编写。代码如下:

代码语言:javascript
复制
package main

import (
    "fmt"
    "sort"
)

func main() {
    arr := []int{1, 2, 3, 4, 5, 6, 7, 8}
    ret := maxPairNum2(arr, 2)
    fmt.Println(ret)
}

// 时间复杂度O(N*logN)
func maxPairNum2(arr []int, k int) int {
    if k < 0 || len(arr) < 2 {
        return 0
    }
    sort.Slice(arr, func(i, j int) bool {
        return arr[i] <= arr[j]
    })
    ans := 0
    N := len(arr)
    L := 0
    R := 0
    usedR := make([]bool, N)

    for L < N && R < N {
        if usedR[L] {
            L++
        } else if L >= R {
            R++
        } else { // 不止一个数,而且都没用过!
            distance := arr[R] - arr[L]
            if distance == k {
                ans++
                usedR[R] = true
                R++
                L++
            } else if distance < k {
                R++
            } else {
                L++
            }
        }
    }
    return ans
}

执行结果如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档