【刷题篇】能同时比赛的最多场次

一、题目

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

二、题解

2.1 方法一:贪心

在这里插入图片描述
【注意】:第一步需要将给定的数组排序,如果不排序数组将失去单调性
在这里插入图片描述

该题目贪心的思路是

L和R 最初都指向数组的头,从左往右进行移动,保证了能力值小的人能先凑到一起比赛,这样就能保证求出最多同时比赛的场数。
在这里插入图片描述

 public static int MaxPairNum2(int[] arr,int k){
        if(k<0||arr==null||arr.length<2){
            return 0;
        }
         Arrays.sort(arr);
        int ans=0;
        int N=arr.length;
        int L=0;
        int R=0;
        boolean[] usedR=new boolean[N];
        while (L<N&&R<N){

            if(usedR[L]){     //当L指向用过的人的时候L++
                L++;
            }else if(L==R){     //当L和R 指向同一个人的时候R++
                R++;
            }else{
                int distance=arr[R]-arr[L];
                if(distance==k){
                    ans++;
                    usedR[R++]=true;
                }else if(distance<k){
                    R++;
                }else{ //如果L和R的差值>k,L++
                    L++;
                }
            }
        }
        return ans;
     }

2.2暴力解法

 public static int maxPairNum1(int[] arr,int k){

        if(k<0){
            return -1;
        }
        return process1(arr,0,k);
    }
    public static int process1(int[] arr,int index,int k){

        int ans=0;
        if(index==arr.length){
            for (int i = 0; i < arr.length; i+=2) {
                if(arr[i]-arr[i-1]==k){
                    ans++;
                }
            }
            }else {
            for(int r=index;r< arr.length;r++){
                swap(arr,index,r);
                ans=Math.max(ans,process1(arr,index+1,k));
                swap(arr,index,r);
            }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值