給定一系列x軸的點座標,例如 1,3,7,8,9,11這些座標升序放在陣列中,現在給一根繩子,長度為4,問繩子最多能覆蓋的點數有多少,例如繩子放前面只能覆蓋兩個點,1,3,如果放後面能覆蓋4個點。
阿新 • • 發佈:2019-01-30
/** * @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思想,不做重複的比較