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

/**
* @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思想,不做重复的比较


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页