训练收获0319

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的核心就是发现一个最优结构使得当前的结果可以用之前计算过的结果表示. 

是用空间换时间,(带备忘录的递归),记忆化搜索,(递归的剪枝)

了解后可以改为非递归,用迭代的形式,并且避免了递归时函数调用的开销

(暴力穷举--->记忆化搜索/递归剪枝--->迭代)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值