列表

详情


LCP 78. 城墙防线

在探险营地间,小扣意外发现了一片城墙遗迹,在探索期间,却不巧遇到迁徙中的兽群向他迎面冲来。情急之下小扣吹响了他的苍蓝笛,随着笛声响起,遗迹中的城墙逐渐发生了横向膨胀。 已知 rampart[i] = [x,y] 表示第 i 段城墙的初始所在区间。当城墙发生膨胀时,将遵循以下规则:

小扣为了确保自身的安全,需要在所有城墙均无重叠的情况下,让城墙尽可能的膨胀。请返回城墙可以膨胀的 最大值

注意:

示例 1:

输入:rampart = [[0,3],[4,5],[7,9]]

输出:3

解释:如下图所示: rampart[0] 向左侧膨胀 3 个单位; rampart[2] 向右侧膨胀 3 个单位; rampart[1] 向左侧膨胀 1 个单位,向右膨胀 2 个单位。 不存在膨胀更多的方案,返回 3。 image.png{:width=750px}

示例 2:

输入:rampart = [[1,2],[5,8],[11,15],[18,25]]

输出:4

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int rampartDefensiveLine(vector<vector<int>>& rampart) { } };

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
    })
}

上一题