1.日志统计
一个贪心问题,巧妙地用map存储,key为integer类型放时间,第二个空放list,里面存储当前时间获得点赞的帖子,从而后面配合for循环滑动窗口,可以对当前时间内被点赞的id进行加减。
自我感觉Map<Integer, List<Integer>>像是一种变相的二维数组,该题的想法是将对应时间ts被点赞的id放到ts的索引下,之后再统一计算和筛选,但是二维数组边界是固定的,而ArrayList自由添加范围可以改变,所以ArrayList配合ma存储当前时间下所有被点赞的帖子id,代替原来想的二维数组
想法:如果遇到想用二维数组解题,但是每一个项后面的项参差不齐数量是浮动的,可以用Map<Integer, List<Integer>>
for(int Index: map.get(i)){//可以的到i时间上的list数组的每一项 cut[Index]++; if(cut[Index]>=k){ bo[Index]=true;} }
import java.util.*;
public class 日志统计0319 {
static int[]cut=new int[100000];
static boolean[]bo=new boolean[100000];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int d=sc.nextInt();
int k=sc.nextInt();
Map<Integer, List<Integer>> map=new HashMap<>();//时间 当前时间被点赞的id
for(int i=0;i<n;i++){//全部存入map
int ts=sc.nextInt();
int id=sc.nextInt();
if(map.containsKey(ts)){
map.get(ts).add(id);
}
else {
ArrayList<Integer> list=new ArrayList<>();
list.add(id);
map.put(ts,list);
}
}
int l=0;
int r=d;
//初始化
for(int i=0;i<d;i++){
if(!(map.get(i) ==null)){
for(int Index: map.get(i)){
cut[Index]++;
if(cut[Index]>=k){
bo[Index]=true;
}
}
}
}
while (r<100000){
if(!(map.get(l) ==null)){
for(int Index: map.get(l)){
cut[Index]--;
}
}
if(!(map.get(r) ==null)){
for(int Index: map.get(r)){
cut[Index]++;
if(cut[Index]>=k){
bo[Index]=true;
}
}
}
r++;
l++;
}
for(int i=0;i<100000;i++){
if (bo[i]){
System.out.println(i);
}
}
}
}
2.动态规划收获
DP的核心就是发现一个最优结构使得当前的结果可以用之前计算过的结果表示.
是用空间换时间,(带备忘录的递归),记忆化搜索,(递归的剪枝)
了解后可以改为非递归,用迭代的形式,并且避免了递归时函数调用的开销
(暴力穷举--->记忆化搜索/递归剪枝--->迭代)