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

来源:互联网 发布:北京和隆优化怎么样 编辑:程序博客网 时间:2024/05/19 07:10

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