之前参考了网上的代码,用Map做的,这是第一次感受到Map的魅力,原来还能这么做,利用Map的put()方法会不断更新一个键的值为最新的(一个键只能有一个值),这刚好可以用来某个数找到最近一次出现的位置,实现了记忆化。
完整代码如下:
Set结构:
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a,b;
a = new int[n];
b= new int[n];
for(int i=0;i<n;i++) {
a[i] = sc.nextInt();
}
b[0] = -a[0];
Set<Integer> set = new HashSet<Integer>();
for(int i=1;i<n;i++) {
int mark = 0;
set.clear();
for(int j=i-1;j>=0;j--) {
if(a[j] == a[i]) {
mark++;
break;
}
set.add(a[j]);
}
if(mark == 0) {
b[i] = -a[i];
}else {
b[i] = set.size();
}
}
for(int i=0;i<n;i++) {
System.out.print(b[i]+" ");
}
}
}
Map结构:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main{
static int[] a, b;
static int n;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
a = new int[n];
b = new int[n];
for(int i=0;i<n;i++) {
a[i] = in.nextInt();
}
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i =0;i<n;i++) {
if(!map.containsKey(a[i])) {
b[i] = -a[i];
map.put(a[i], i);
}else {
b[i] = as1(map.get(a[i])+1,i);
map.put(a[i], i);
}
}
for(int i=0;i<n;i++) {
System.out.print(b[i]+" ");
}
}
public static int as1(int b,int c) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=b;i<c;i++) {
map.put(a[i], 1);
}
return map.size();
}
}