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

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛。一局比赛只有两个人,返回最多可以同时有多少场比赛。相关的知识,希望对你有一定的参考价值。

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

福大大 答案2021-06-23:

时间紧,思路见代码。

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

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:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛。一局比赛只有两个人,返回最多可以同时有多少场比赛。的主要内容,如果未能解决你的问题,请参考以下文章

2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左;arr[i] == 2,代表汉诺塔问题中,从上

换钱最少货币数

2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K,代表绳子的长度。返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。

动态规划

动态规划-换钱最少货币数

4.4 换钱的方法数