Introduction
Input
Output
Sample
input
11 3 1 2 0 0 2 0 4 5 0 2
output
5
Solution
import java.util.Collection; import java.util.LinkedList; import java.util.Scanner; import java.util.TreeMap; public class Main { public static void main(String[] args) { Scanner s=new Scanner(System.in); int n=s.nextInt(); int[] arr=new int[n+2]; TreeMap<Integer, LinkedList<Integer>> treeMap=new TreeMap(); for(int i=1;i<=n;i++){ arr[i]=s.nextInt(); if(arr[i]!=0){ if(!treeMap.containsKey(arr[i])){ LinkedList<Integer> linkedList=new LinkedList(); linkedList.add(i); treeMap.put(arr[i],linkedList); }else { treeMap.get(arr[i]).add(i); } } } int count=0; for(int i=1;i<=n;i++){ if(arr[i+1]==0&&arr[i]!=0){ count++; } } int max=count; Collection<LinkedList<Integer>> lists = treeMap.values(); for(LinkedList<Integer> list:lists){ for(int index:list){ arr[index]=0; if(arr[index-1]==0&&arr[index+1]==0){ count--; }else if(arr[index+1]!=0&&arr[index-1]!=0) { count++; } } max= Math.max(max,count); } System.out.println(max); } }
Experience
csp第二题肯定来说用暴力解决的话只能得70分。这里的优化方法参考了https://blog.csdn.net/weixin_41565005/article/details/120666496。提供的思路非常有用,用到了java里面的TreeMap。在第一次计算非零序列的时候,我简化了一下,数量只需要遍历的时候判断 arr[i+1]==0&&arr[i]!=0 即可。