给定能力值,最多能够举办多少场比赛(算法)

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

解法:贪心+双指针。

先进行排序,双指针L与R,判断对应人是否能够一起比赛。如果能,则记录并且L++、R++;如果差大于k,那么说明L不够大,则L++;如果差小于k,那么说明R不够大,则R++。

/**
 * 给定一个数组arr,代表每个人的能力值。
 * 再给定一个非负数k,如果两个人能力差证号为k,那么可以凑在一起比赛
 * 一局比赛只能有两个人
 * 返回最多可以同时有多少场比赛
 */
public class Question9 {
    public static void main(String[] args) {

    }


    /**
     * 贪心+双指针
     * 贪心:先排序,然后让最左边的先匹配
     *
     * @param arr
     * @return
     */
    public int maxRaceNum(int[] arr, int k) {
        if (arr == null || arr.length <= 1) return 0;
        //排序
        Arrays.sort(arr);
        int L = 0;
        int R = 0;
        int res = 0;
        boolean[] used = new boolean[arr.length];
        while (R < arr.length) {
            //如果被使用过,那就跳过
            if (used[L]) L++;
            //R不能比L小
            else if (L >= R) {
                R++;
            } else {
                //如果相等
                if (arr[R] - arr[L] == k) {
                    //标记已经使用
                    used[L] = true;
                    used[R] = true;
                    //同时往下跳
                    R++;
                    L++;
                    res++;
                } else if (arr[R] - arr[L] > k) {
                    //大于k,则说明arr[L]不够大=>L++
                    L++;
                } else if (arr[R] - arr[L] < k) {
                    //小于k,则说明arr[R]不够大==>R++
                    R++;
                }
            }
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值