arr이라는 배열이 있다고 가정하고 arr의 나머지 요소가 감소하지 않는 순서로 되도록 arr의 하위 배열을 제거해야 합니다. 제거할 가장 짧은 하위 배열의 길이를 찾아야 합니다.
따라서 입력이 arr =[10,20,30,100,40,20,30,50]과 같으면 길이 3의 가장 작은 부분배열인 [100, 40, 20]을 제거할 수 있기 때문에 출력은 3이 됩니다. 그리고 이것들을 제거하면 모두 내림차순이 아닙니다[10,20,30,30,50].
이 문제를 해결하기 위해 다음 단계를 따릅니다.
- n :=arr의 크기
- arr :=arr의 왼쪽에 0을 삽입하고 오른쪽에 무한대를 삽입
- A,B :=두 개의 새로운 빈 목록
- p :=1, q:=arr의 크기 -2
- 남 :=0
- p <=q인 동안 do
- arr[p-1] <=arr[p]이면
- A 끝에 arr[p] 삽입
- p :=p + 1
- 그렇지 않으면 arr[q] <=arr[q+1]일 때
- B 끝에 arr[q] 삽입
- A가 비어 있지 않고 A의 마지막 요소인 동안> B의 마지막 요소, do
- A에서 마지막 요소 삭제
- q :=q - 1
- 그렇지 않으면
- 루프에서 나오다
- M :=M의 최대값 및 A의 크기 + B의 크기
- arr[p-1] <=arr[p]이면
- n - M을 반환
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
예
def solve(arr):
n = len(arr)
arr = [0] + arr + [float("inf")]
A,B=[],[]
p,q=1,len(arr)-2
M = 0
while p <= q:
if arr[p-1] <= arr[p]:
A.append(arr[p])
p += 1
elif arr[q] <= arr[q+1]:
B.append(arr[q])
while A and A[-1] > B[-1]:
A.pop()
q -= 1
else:
break
M = max(M, len(A)+len(B))
return n - M
arr = [10,20,30,100,40,20,30,50]
print(solve(arr)) 입력
[10,20,30,100,40,20,30,50]
출력
3