🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 其他高效技巧 ## two pointers 利用问题本身与序列的特性,使用两个下标 i,j 对序列进行扫描,以较低的复杂度解决问题。 典型的应用有归并排序和快速排序。 ## 打表 打表是典型的用空间换时间的技巧,常见用法有 - 在程序中一次性计算出所有需要的结果,之后直接查询取值 - 在 B 程序中分一次或多次计算所有需要的结果,手工把结果写在 A 程序的数组中,然后在 A 程序中可直接使用。例如,n 皇后问题 - 对于想不出算法的题目,先用暴力程序计算小范围数据的结果,然后找蛛丝马迹 ## 活用递推 例如,有几个 PAT 的题目,找每个 A 左侧的 P 和右侧的 T ## 随机选择算法 ```C++ // 随机选择算法,从递增序列 a[left, right] 中返回第 K 小的数 int randSelect(int a[], int left, int right, int K){ if(left==right) return a[left]; // 递归边界 // p 为 A[left] 在 a[left, right] 中的位置 int p=partition(a,left,right); // p 是 在 a[left, right] 第 M 小的数 int M=p-left+1; if(K==M) return a[p]; if(K<M) return randSelect(a,left,p-1,K); else return randSelect(a,p+1,right,M-K); } ``` ## ChangeLog > 2018.09.03 初稿