题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
import bisect
def inc_max(s):
q = []
dp=[]
for n in s:
idx = bisect.bisect_left(q, n)
dp.append(idx+1)
if idx == len(q):
q.append(n)
else:
q[idx] = n
return dp
N = int(input())
s = list(map(int, input().split()))
left_s = inc_max(s) # 从左至右
right_s = inc_max(s[::-1])[::-1] # 从右至左
sum_s = [left_s[i] + right_s[i] - 1 for i in range(len(s))] # 相加并减去重复计算
print(str(N - max(sum_s)))
这个更简单一点
新建一个数组,然后第一个数先放进去,然后第二个数和第一个数比较,如果说大于第一个数,那么就接在他后面,如果小于第一个数,那么就替换,一般的,如果有i个数,那么每进来一个新的数,都要用二分查找法来得知要替换在哪个位置的数。
