给定一系列x轴的点坐标,例如 1,3,7,8,9,11这些坐标升序放在数组中,现在给一根绳子,长度为4,问绳子最多能覆盖的点数有多少,例如绳子放前面只能覆盖两个点,1,3,如果放后面能覆盖4个点。

2 篇文章 0 订阅

/**
* @param $data 待查找数组
* @param $rLen 绳子长度
*/
function getRopeNum($data,$rLen) {
    $n      = count($data);
    //当前最大个数
    $max    = 0;
    $i      = 0;
    $cur    = 0;
    while($i < $n - $max){
        for($j = $cur;$j < $n -$i;$j++){
            if($j == 0){
                //len为0,无须比较
                $cur++;
                continue;
            }
            if($data[$i+$j] - $data[$i] <= $rLen){
                //小于rLen 当前数量加1
                $cur++;
            }
            else{
                if($cur > $max){
                    //调整当前最大个数
                    $max = $cur;
                }
                //寻找下一个,当前个数减1
                $cur   = $j-1;
                break;
            }
        }
        $i++;
    }
    return $max;
}

1、首先抽象下题目,覆盖绳子,就是需要找一段长度小于绳子长度的区间,输出符合要求的最多元素个数的区间。

2、区间的长度就是区间上确界减去下确界

3、学习KMP思想,不做重复的比较


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值