ACM经验大杂烩

目录

一,题目类型

二,时间复杂度

三,模板积累

四,STL

五,压行坑之类型坑

六,算法形态

1,生命周期

​2,持久化

3,离散化


一,题目类型

常见的题目分为几大类:

1,算法

分治、搜索、贪心、DP

2,数据结构

链表、二叉树、并查集、树状数组、线段树

3,数学

数论、几何、图论

4,模拟

二,时间复杂度

时间复杂度第四章

三,模板积累

ACM模板

四,STL

 ACM总结——STL标准模板库

五,压行坑之类型坑

我在力扣OJ 1314. 矩阵区域和 里面,我写了一个小函数:

int f(vector<vector<int>> &mat, int i, int j)
    {
        if (i < 0 || j < 0) return 0;
        if (i >= mat.size()) i = mat.size() - 1;
        if (j >= mat[0].size()) j = mat[0].size() - 1;
        return mat[i][j];
    }

这是一个已经AC的代码里面的一个函数,然而,故事并没有结束。

为了压缩行,我改成了:

    int f(vector<vector<int>> &mat, int i, int j)
    {
        return (i < 0 || j < 0) ? 0 : mat[min(i,mat.size() - 1)][min(j,mat[0].size() - 1)];
    }

结果编译错误,为什么呢?

因为size函数返回的是unsigned long

我改成:

    int f(vector<vector<int>> &mat, unsigned int i,unsigned int j)
    {
        return (i < 0 || j < 0) ? 0 : mat[min(i,mat.size() - 1)][min(j,mat[0].size() - 1)];
    }

还是编译错误,再改成

    int f(vector<vector<int>> &mat, unsigned long i,unsigned long j)
    {
        return (i < 0 || j < 0) ? 0 : mat[min(i,mat.size() - 1)][min(j,mat[0].size() - 1)];
    }

结果编译成功但是居然解答错误。

仔细一看,这个代码就是一坨垃圾,i<0根本就是不可能的。

如果非要压缩行的话,只能做类型转换。

六,算法形态

1,生命周期

从生命周期的角度,我们对常见算法的经典形态做一个梳理。

生命周期一般包括初始化、更新、查询三个过程。

(1)分治、贪心支持单次查询

(2)搜索、动态规划支持多次查询

(3)​树状数组支持多次单点更新、多次区间查询。

(4)线段树支持多次单点更新、多次区间查询,也支持多次区间更新、多次区间查询。

(5)很多树、优先队列、哈希表都支持多次更新、多次查询。

​2,持久化

如果有大量查询,为了使得单次查询变得高效,我们需要对算法做持久化。

按照查询模式分为两种,离线查询是一次把大量查询请求全部输入,一次性输出所有查询结果,而在线查询是需要提供单次查询接口,这个接口会被调用很多次。

(1)硬编码

如果单次查询时间长,但是总查询情况数比较少,可以用硬编码,即二次编码(二次编程)。

按照题目中的关键字,我搜到这些应用:

二次编码、二次编程

力扣 1215. 步进数
力扣 866. 回文素数
力扣 2485. 找出中枢整数
力扣 351. 安卓系统手势解锁
力扣 面试题 17.09. 第 k 个数  

硬编码

HDU 2553 N皇后问题

CSU 1727 The Fake Coin

POJ 1185 炮兵阵地

HDU 1016 Prime Ring Problem

UVALive 2701 Find The Multiple

力扣 375. 猜数字大小 II

力扣 2992. 自整除排列的数量

(2)可持久化并查集

并查集

(3)可持久化字典树

(4)可持久化线段树

3,离散化

(1)数据的离散化

力扣 255. 验证前序遍历序列二叉搜索树

离散化+sum型线段树

(2)解空间的离散化

持久化的代价是空间复杂度太高,为了均衡时间和空间,可以对持久空间做离散化。

力扣 1724. 检查边长度限制的路径是否存在 II

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值