一、暴力解法未优化(70分)
public static void main(String[] args) {
// int n=15;
// int[] A=new int[] {1,3,1,2,2,2,2,2,2,2,1,6,1,7,1};
// int n=14;
// int[] A=new int[] {5,1,20,10,10,10,10,15,10,20,1,5,10,15};
// int n=11;
// int[] A=new int[] {3,1,2,0,0,2,0,4,5,0,2};
//暴力解法
//输入
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] A=new int[n];
for(int i=0;i<n;i++) {
A[i]=sc.nextInt();
}
//不同元素存放list中,作为p
int max=0;
List<Integer>list=new ArrayList<>();
for(int i=0;i<A.length;i++) {
if(!list.contains(A[i]))
list.add(A[i]);
}
// System.out.println(list);
for(int j=0;j<list.size();j++) {
int p=list.get(j);
int count=0;
//遇见<=p 则判断
for(int i=0;i<A.length;i++) {
if(i==0&&A[i]<=p)continue;
//特殊情况,如果第一个数小于等于p,跳过
if(i>0&&A[i]<=p&&A[i-1]>p)count++;
//遍历数组A,如果A[i]<=p (可看似为0)且A[i-1]>p (可看似不为0),则此处前面为一个非零段
}
if(A[A.length-1]>p)count++;
//最后不是<=p的话,也可分为一个非零段
max=Math.max(max, count);
}
System.out.println(max);
}
二、暴力解法+优化(100分)
(看不懂的话建议可以把把map输出,依次输出count,根据count的变化看代码实现过程)
public static void main(String[] args) {
// int n=15;
// int[] A=new int[] {0,1,3,1,2,2,2,2,2,2,2,1,6,1,7,1,0};
// int n=14;
// int[] A=new int[] {0,5,1,20,10,10,10,10,15,10,20,1,5,10,15,0};
// int n=11;
// int[] A=new int[] {0,3,1,2,0,0,2,0,4,5,0,2,0};
//输入
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] A=new int[n+2];
//将A[0],A[A.length-1]固定为1,方便计算
for(int i=1;i<=n;i++) {
A[i]=sc.nextInt();
}
//用TreeMap储存:会自动排序
//key-> 表示A[] 中出现不同元素
//value->表示 A[] 中不同元素的下标
Map<Integer,List<Integer>> map=new TreeMap<>();
for(int i=1;i<=n;i++) {
if(A[i]==0)continue;//不必记录0 的下标
if(map.containsKey(A[i])) {
map.get(A[i]).add(i);
}
else {
List<Integer> list=new ArrayList<>();
list.add(i);
map.put(A[i], list);
}
}
// System.out.println(map);
//p=1时的非零段个数(即数组没改变时的非零段个数)
int count=0;
for(int i=1;i<A.length;i++) {
if(A[i]==0&&A[i-1]!=0)count++;
}
// System.out.println(count);
int max=count;
Collection<List<Integer>> listCollections=map.values();
//取出map的value
for(List<Integer> myList:listCollections) {
for(int i=0;i<myList.size();i++) {
int id=myList.get(i);
A[id]=0;
if(A[id+1]==0&&A[id-1]==0)count--;
//如果此时下标id+1和下标id-1的元素均为0,则非零段-1
if(A[id+1]!=0&&A[id-1]!=0)count++;
//如果此时下标id+1和下标id-1的元素均不为0,则非零段+1
//如果此时下标id+1或下标id-1的元素其中一个为0,非零段不变
}
max=Math.max(max, count);
}
System.out.println(max);
}