题目:
输入例子1:
5
1 2 3 3 5
3
1 2 1
2 4 5
3 5 3
输出例子1:
1
0
2
例子说明1:
样例解释:
有5个用户,喜好值为分别为1、2、3、3、5,
第一组询问对于标号[1,2]的用户喜好值为1的用户的个数是1
第二组询问对于标号[2,4]的用户喜好值为5的用户的个数是0
第三组询问对于标号[3,5]的用户喜好值为3的用户的个数是2
解法:
首先,我尝试了每次询问都去记录一下区间中k的个数,很明显会超时。正确做法应该是,记录下来每个喜好值对应的下标有哪些。然后根据k值获得这些下标,再选择满足条件的下标即可。
代码:
package test1;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class Main1 {
public static void main(String[] args) {
int n,m;
HashMap<Integer,List<Integer>> map=new HashMap<>(); //存储喜好值,和该喜好值的所有下标
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for(int i=1;i<=n;i++) {
int a=sc.nextInt();
if(!map.containsKey(a)) {
ArrayList<Integer> list=new ArrayList<>();
list.add(i);
map.put(a, list);
}else {
ArrayList<Integer> list=(ArrayList<Integer>) map.get(a);
list.add(i);
map.put(a, list);
}
}
m=sc.nextInt();
for(int i=1;i<=m;i++) {
int x,y,k,sum=0;
x=sc.nextInt();
y=sc.nextInt();
k=sc.nextInt();
if(map.get(k) != null) {
ArrayList<Integer> list=(ArrayList<Integer>) map.get(k);
Iterator<Integer> it=list.iterator();
while(it.hasNext()) {
int b=it.next();
if(b>=x&&b<=y) {
sum++;
}
}
}
System.out.println(sum);
}
}
}