1. 程式人生 > >給定一系列x軸的點座標,例如 1,3,7,8,9,11這些座標升序放在陣列中,現在給一根繩子,長度為4,問繩子最多能覆蓋的點數有多少,例如繩子放前面只能覆蓋兩個點,1,3,如果放後面能覆蓋4個點。

給定一系列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思想,不做重複的比較