以每一个同学为中心,分别计算左侧的最长递增子序列和右侧的最长递减子序列,然后记录最大值len(pos_tails)+len(neg_tails)+1,最后加的1是中心同学。
但是这么写是17/21,会超时
n = int(input().strip())
nums = list(map(int, input().split()))
r_nums = list(reversed(nums))
def get_incr_tails(its, max_num):
tails = []
for num in its:
if num >= max_num:
continue
l, r = 0, len(tails)
while l < r:
m = (l+r) // 2
if num <= tails[m]:
r = m
else:
l = m + 1 # 防止队列重叠陷入死循环
if l >= len(tails):
tails.append(num)
elif num < tails[l]:
tails[l] = num
return tails
# 以第i个同学为hi
max_queue_num = 0
for i in range(1, len(nums)-1):
# 正序获取最大递增子序列的tails列表
pos_tails = get_incr_tails(nums[:i], nums[i])
# 倒序取出最大递增子序列的tails列表
neg_tails = get_incr_tails(r_nums[:n-(i+1)], nums[i])
if len(pos_tails) == 0 or len(neg_tails) == 0:
continue
curr_queue_num = len(pos_tails) + len(neg_tails) + 1
if curr_queue_num > max_queue_num:
max_queue_num = curr_queue_num
print(len(nums) - max_queue_num)



京公网安备 11010502036488号