牛客--合唱队
題目描述
計算最少出列多少位同學,使得剩下的同學排成合唱隊形
說明:
N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設K位同學從左到右依次編號為1,2…,K,他們的身高分別為T1,T2,…,TK,???則他們的身高滿足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任務是,已知所有N位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
請注意處理多組輸入輸出!
?
輸入描述:
整數N
輸出描述:
最少需要幾位同學出列
示例1
輸入
復制
8 186 186 150 200 160 130 197 200輸出
復制
4思路:求遞增子序列
把每個位置都先看作中心點
先求出每個位置左邊和右邊比他小的子序列
之后找出左右子序列之和最大的中心節點即可,這就是最終的隊列,用總數減去這個隊列的數量。
例如:186是第一個,左邊沒有值,他的左子序列長度為1。第二個186,左邊和他的值一樣,所以左邊沒有比他小的,他的左子序列也是1。150左邊沒有比他小的,他的左子序列也是1。200左邊可以是150或者186,所以他的左子序列是2。
代碼:
import java.util.*;
public class Main{
? ? public static void main(String[] args){
? ? ? ? Scanner sc = new Scanner(System.in);
? ? ? ? while(sc.hasNext()){
? ? ? ? ? ? int n = sc.nextInt();
? ? ? ? int nums[] = new int[n];
? ? ? ? int left[] = new int[n];
? ? ? ? int right[] = new int[n];
? ? ? ? for(int i=0;i<n;i++){
? ? ? ? ? ? nums[i] = sc.nextInt();
? ? ? ? ? ? left[i] = 1;
? ? ? ? ? ? right[i] = 1;
? ? ? ? }
? ? ? ? for(int i=1;i<n;i++){
? ? ? ? ? ? int max = 0;
? ? ? ? ? ? for(int j=i-1;j>=0;j--){
? ? ? ? ? ? ? ? if(nums[i]>nums[j])
? ? ? ? ? ? ? ? max = Math.max(max,left[j]);
? ? ? ? ? ? }
? ? ? ? ? ? left[i]+=max;
? ? ? ? }
? ? ? ? for(int i=n-2;i>=0;i--){
? ? ? ? ? ? int max = 0;
? ? ? ? ? ? for(int j=i+1;j<n;j++){
? ? ? ? ? ? ? ? if(nums[i]>nums[j])
? ? ? ? ? ? ? ? max = Math.max(max,right[j]);
? ? ? ? ? ? }
? ? ? ? ? ? right[i]+=max;
? ? ? ? }
? ? ? ? int max = 1;
? ? ? ? for(int i=0;i<n;i++){
? ? ? ? ? ? max = Math.max(max,left[i]+right[i]);
? ? ? ? }
? ? ? ? System.out.println(n-max+1);
? ? ? ? }
? ? ? ??
? ? }
}
總結
- 上一篇: Leetcode--343. 整数拆分
- 下一篇: 测试动态视力软件叫什么影响吗,动态视力