基础算法结尾

本文介绍了如何从暴力遍历的O(n^2)时间复杂度优化到使用双指针达到接近O(n)的时间效率。同时,讲解了位运算中的lowbit函数及其应用,并提及了库函数unique在去重方面的使用,以及它通常与erase配合在vector容器中的操作。此外,还分享了个人在学习基础算法和数据结构过程中的体会,尽管挑战重重,但会持续努力。
摘要由CSDN通过智能技术生成

双指针:

核心思想:优化

暴力:(时间复杂度O(n^2)

for(int i = 0; i < n; i ++)
    for(int j = 0; j < i; j ++)
        if(check(i, j))

双指针:(时间复杂度接近O(n))

for(int i = 0, j = 0; i < n; i ++){
    while(j < i && check(i, j))

一般写双指针之前都可以向写一下暴力。

位运算:

位运算对我来说只能见到一点学习一点,感觉这个的内容太大了,现在我只会一点简单的位运算(我之前写过一次关于位运算)。

lowbit(int a) 返回的最有的1的位置 例如 33(二进制为100100) lowbit(33) = 4(二进制为100)

int lowbit(int a){
    return a & -a;
}

-a为a的补码(-a = ~a + 1)

库函数

unique(a.begin(), a.end()),对a去重并返回其去重后的迭代器(这里说的不是很明白)

举个例子: a[] = { 1, 1, 2, 3, 4, 4, 4, 5, 5, 6}

unique(a.begin(), a.end()) 后 a[] = {1, 2, 3, 4, 5, 6, ... }返回6后面的迭代器。

一般与erase一起用(纯属个人感觉)(用于vector容器中)

vector<int> a; a[] = { 1, 1, 1, 1, 1, 2, 3, 4, 4, 6, 6, 7, 9}

a.erase(unique(a.begin(), a.end()), a.end()); 后 a[] = { 1, 2, 3, 4, 6, 7, 9}

unique函数的实现

vector<int>::iterator unique(vector<int>& a){
    int j = 0;
    for(int i = 0; i < a.size(); i ++)
        if(!i || a[i] != a[i - 1]
            a[j ++] = a[i];

总结:

现在总算把基础算法看完了(排序,高精度,前缀和(结合在哈希表中了)这些前面都发过了),

有些位置对我来说还是有点难理解的,哎,后面要学习数据结构了,难度也越来越大了,只能慢慢来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值