题目描述
题目背景:
数轴世界建立之初,还没有任何的生机。直到有一天,在数轴的整点上,慢慢诞生了一个一个新兴的文明。如果两个文明相邻,也就是在他们之间不存在其他的整点,他们就会慢慢受到彼此的影响,逐渐融为一个整体。而当所有的文明大一统,全部融为一个整体的时候,这个数轴世界才会重归和平。为了能够让自己的文明发展壮大,牛牛决定根据每个文明诞生的年代表,计算出什么时候才是和平的黄金时代。
简明题意:
我们定义一个整数可重集合是好的,当且仅当对于集合中任意两个元素 a, b (a \leq ba≤b) ,所有满足 a\leq c\leq ba≤c≤b 的元素 c 都在集合中出现过。
现在,给你一个数组 mSet,你需要做的是,对于这个数组的每一个前缀,判断这个前缀是不是一个好的集合。所以,你将计算出的是一个数组,为布尔类型。
示例1
输入
复制
[3,5,4,6]
输出
复制
[true,false,true,true]
说明
第一个前缀只有一个元素3,按照好的集合的定义,它显然是连续的。
第二个前缀有一个3和一个5,位于3和5之间的元素4却不在集合中,所以它不是连续的。
第三个前缀添加了一个4,弥补了第二个集合缺少4的问题,所以它是好的。
第四个前缀新增了一个6,依旧连续。
备注:
对于所有的数据,满足mSet的大小小于105, mSet[i]是32位有符号整数范围内的元素。
AC代码:
import java.util.*;
public class Solution {
/**
* 检查数组的每个前缀是不是一个好的集合
* @param mSet int整型一维数组
* @return bool布尔型一维数组
*/
public boolean[] continuousSet (int[] mSet) {
if(mSet.length==0)return new boolean[mSet.length];
int minn=mSet[0];
int maxn=mSet[0];
boolean[] vis=new boolean[mSet.length];
Map<Integer,Integer>map=new HashMap<>();
int flag=0;
for(int i=0;i<mSet.length;i++){
if(i==0){
vis[i]=true;
flag++;
}
else{
if(map.get(mSet[i])!=null){
vis[i]=vis[i-1];
}
else{
flag++;
minn=Math.min(minn,mSet[i]);
maxn=Math.max(maxn,mSet[i]);
if(maxn-minn==flag-1)vis[i]=true;
else vis[i]=false;
}
}
map.put(mSet[i],1);
}
return vis;
}
}