# 海蒂爷爷的木桶 海蒂爷爷想做一个奇怪的木桶。他去山里砍了一些木柴并加工成高矮不一的木板,然后把木...
創建於:2025年9月24日
創建於:2025年9月24日
海蒂爷爷想做一个奇怪的木桶。他去山里砍了一些木柴并加工成高矮不一的木板,然后把木板按高矮排好顺序,依次取出,竖在地上,排列成一个圆桶状。该圆桶满足循环单调非递减规律(即从第1块木板开始,后续的木板不矮于前一根,直到最高的木板与第一块最矮的木板连接在一起)。
正当海蒂爷爷想用铁箍将木桶箍上时,小海蒂从远处跑来,递给爷爷一条新的木板。请把新木板插入合适的位置,把奇怪的木桶完成。如果新木板有多个位置可以插入时,则放置在下标最小的位置。如[1 2 3 1]
插入1,预期输出结果为[1 1 2 3 1]
,而不是[1 2 3 1 1]
。
n
,其中2 < n <= 400
。boards
,列表中每个元素表示木板高度,原始列表满足循环非递减条件,且1 <= boards[i] <= 1000
。newBoardLen
,其中1 <= newBoardLen <= 1000
。返回插入新数据后的boards
列表。
输入:
text4 2 3 4 2 1
输出:2 3 4 1 2
解释:新增木板长度为1,只有插在原第3块和第四块木板之间,才能满足循环非递减规律,所以新列表为2 3 4 1 2
。
输入:
text4 1 2 3 1 1
输出:1 1 2 3 1
解释:新增木板长度为1,插入木桶后,插在第一个1的前后或者插在最后一个1的前后,均满足循环非递减规律,按题目要求放置在下标最小位置即插入第一个1前,所以新列表为1 1 2 3 1
。
给我python代码以及解题思路
给定一个循环单调非递减的数组 boards
,我们需要将一个新木板 newBoardLen
插入其中,使插入后的数组仍然满足循环单调非递减规律。
数组 [a0, a1, a2, ..., an-1]
满足以下条件:
start
),按顺序往后看,每个元素不小于前一个,直到绕一圈回到起点。例如,[2 3 4 2]
是一个循环单调非递减数组,因为:
2
开始,→ 3
→ 4
→ 2
(比前一个4
小)→ 回到开头2
也就是说,这种数组至多只有一个“转折点”,在这个点前是递增(或平),之后从最大值跳到最小值。
找出在什么位置插入 newBoardLen
,能保持原数组的循环非递减性。若有多个位置满足,取最小下标插入位置。
newBoardLen
插入并形成新数组 newBoards
。我们定义一个辅助函数 is_circular_non_decreasing(arr)
,用来判断一个数组是否符合循环非递减条件。
pythondef is_circular_non_decreasing(arr): n = len(arr) count = 0 for i in range(n): if arr[i] > arr[(i + 1) % n]: count += 1 if count > 1: return False return True def insert_new_board(n, boards, newBoardLen): for i in range(n + 1): new_boards = boards[:i] + [newBoardLen] + boards[i:] if is_circular_non_decreasing(new_boards): return new_boards # 示例用法 if __name__ == "__main__": # 样例输入 n = int(input()) boards = list(map(int, input().split())) newBoardLen = int(input()) result = insert_new_board(n, boards, newBoardLen) print(' '.join(map(str, result)))
text输入: 4 2 3 4 2 1 输出: 2 3 4 1 2
text输入: 4 1 2 3 1 1 输出: 1 1 2 3 1
O(n)
O(n)
O(n^2)
,但由于 n <= 400
,可以接受。如需进一步优化或进行单元测试、封装成类等,也可以继续扩展。需要的话可以告诉我,我可以帮你实现。