class Solution {
public:
int rampartDefensiveLine(vector<vector<int>>& rampart) {
}
};
LCP 78. 城墙防线
在探险营地间,小扣意外发现了一片城墙遗迹,在探索期间,却不巧遇到迁徙中的兽群向他迎面冲来。情急之下小扣吹响了他的苍蓝笛,随着笛声响起,遗迹中的城墙逐渐发生了横向膨胀。
已知 rampart[i] = [x,y]
表示第 i
段城墙的初始所在区间。当城墙发生膨胀时,将遵循以下规则:
小扣为了确保自身的安全,需要在所有城墙均无重叠的情况下,让城墙尽可能的膨胀。请返回城墙可以膨胀的 最大值 。
注意:
rampart
中的元素升序排列;示例 1:
输入:
rampart = [[0,3],[4,5],[7,9]]
输出:
3
解释:如下图所示:
rampart[0]
向左侧膨胀 3 个单位;rampart[2]
向右侧膨胀 3 个单位;rampart[1]
向左侧膨胀 1 个单位,向右膨胀 2 个单位。 不存在膨胀更多的方案,返回 3。 {:width=750px}
示例 2:
输入:
rampart = [[1,2],[5,8],[11,15],[18,25]]
输出:
4
提示:
3 <= rampart.length <= 10^4
rampart[i].length == 2
0 <= rampart[i][0] < rampart[i][1] <= rampart[i+1][0] <= 10^8
原站题解
python3 解法, 执行用时: 396 ms, 内存消耗: 20.7 MB, 提交时间: 2023-05-08 10:02:22
class Solution: def rampartDefensiveLine(self, rampart: List[List[int]]) -> int: l = 0 r = float('inf') n = len(rampart) for i in range(1,n - 1): r = min(r,rampart[i][0] - rampart[i - 1][1] + rampart[i + 1][0] - rampart[i][1]) def check(x): lst = rampart[0][1] for i in range(1,n - 1): left = rampart[i][0] - lst if left >= x: lst = rampart[i][1] continue cnt = x - left right = rampart[i + 1][0] - rampart[i][1] if right >= cnt: lst = rampart[i][1] + cnt else: return False return True while l <= r: mid = l + (r - l) // 2 if check(mid): l = mid + 1 else: r = mid - 1 return l - 1
golang 解法, 执行用时: 156 ms, 内存消耗: 7.4 MB, 提交时间: 2023-05-08 10:01:57
func rampartDefensiveLine(rampart [][]int) (ans int) { n := len(rampart) leftSpace := rampart[n-1][0] - rampart[0][1] for _, p := range rampart[1 : n-1] { leftSpace -= p[1] - p[0] } return sort.Search(leftSpace/(n-2), func(mx int) bool { mx++ preR := rampart[0][1] for i := 1; i < n-1; i++ { r := rampart[i][1] space := mx - (rampart[i][0] - preR) if space > 0 { r += space // 向右膨胀 if r > rampart[i+1][0] { // 无法膨胀 return true } } preR = r } return false }) }