以[1,2,2,1,1,3,0,0,2,2,3,2,3]为例子
最简单的是暴力破解法,两个循环,这肯定被鄙视的,在参考了网上的一些想法后,自己写了个Java版本的,主要思想为
第一步:使用两个指针,一开始都指向头节点。
第二步:指针一往后移动,在范围内,当包含了所有颜色的时候,停下来。
第三步:指针二往后移动,在范围内,移动的过程中判断是否包含所有颜色,当不包含的时候停下来。
第四步:计算两指针间距离,如果小于上一最小记录便将最小记录更改为该距离。
第五步:重复以上动作直到指针一越界停止。
这里使用一个判断函数,用来计算是否包含了所有元素,思路为开辟一个颜色大小的数组,将颜色分别对应一个数字,这可以通过枚举实现:
开始所有数组元素置为0,指针一移动时,将指针一指向的元素下标对应的元素加一,指针二移动的时候减一。如下:
public class LeastBeadsLength {
private int[] beads = {1,2,2,1,1,3,0,0,2,2,3,2,3};
private int[] flags = {0,0,0,0};
void getResult(){
System.out.println(getShortestBeads(beads));
}
boolean isFull(){
int ret = 1;
for (int i = 0; i < flags.length; i++) {
ret*=flags[i];
}
return ret==0?false:true;
}
void checkState(){
System.out.println(isFull());
}
int getShortestBeads(int[] beads){
int len = beads.length;
int ap = 0,bp = 0;
int least = len;
while(bp<len){
while(!isFull()&&bp<len){
flags[beads[bp]]+=1;
bp++;
}
while(isFull()){
flags[beads[ap]]-=1;
ap++;
}
if(bp<=len){
int count = bp-ap+1;
if(count < least){
least = count;
}
}
else return least;
}
return least;
}
public static void main(String[] args) {
LeastBeadsLength leastBeadsLength = new LeastBeadsLength();
leastBeadsLength.getResult();
}
}