LeetCode刷题笔记

刷题笔记

冷门的知识点

启发式搜索
拓扑排序

方便的函数

数组

log10(), log()
srand((unsigned)time(NULL));
copy(original.begin(), original.end(), nums.begin());
sort(nums.begin(), nums.end());
reverse(nums.begin(), nums.end());

//排序传参传引用可以省时间
sort(intervals.begin(), intervals.end(), [](auto &u, auto &v) {
return u[1] < v[1];
});

遍历数字中每一位1为1或0的所有情况

    int x = 0x77, temp = x, cnt = 0; 
    do {
        x = (x - 1) & temp;
        cout << x << ' ';
        cnt++;
        if (x == temp)break;
    } while (true);
    cout<<endl << cnt;

list的erase用法(map,multimap,set,multiset类似)

    //正确使用方法1
    std::list<int> List;
    for (auto it = List.begin(); it != List.end();) {
        if (WillDelete(*it)) it = List.erase(it);
        else it++;
    }

    //正确使用方法2      
    std::list<int> List;
    for (auto it = List.begin(); it != List.end(); ) {
        if (WillDelete(*it)) List.erase(it++);
        else it++;
    }

设计哈希表的取模法的素数选择

在这里插入图片描述

建堆

使用STL的函数
//默认建立大顶堆,使用greater<int>()参数建立小顶堆
make_heap(nums.begin(), nums.end(), greater<int>());
//将nums最后一个元素插入合适的位置
push_heap(nums.begin(), nums.end(), greater<int>());
//交换首尾元素并调整堆
pop_heap(nums.begin(), nums.end(), greater<int>());
使用实例
class MyHeap {
    int len;
    int* heap;
public:
    MyHeap(int n) {
        len = 0;
        heap = new int[n + 1];//heap[0]为空位
    }
    int size() {
        return len;
    }
    int top() {
        return heap[1];
    }
    void pop() {
        pop_heap(heap + 1, heap + len + 1, greater<int>());
        len--;
    }
    void push(int val) {
        heap[++len] = val;
        push_heap(heap + 1, heap + len + 1, greater<int>());
    }
};
手搓小顶堆实例
class MyHeapByHand {
    int len;
    vector<int> heap;
    void adjustHead(int v) {
        heap[0] = heap[v];
        for (int i = v * 2; i <= len; i *= 2) {
            if (i + 1 <= len && heap[i] > heap[i + 1])i++;
            if (heap[i] < heap[0]) {
                heap[v] = heap[i];
                v = i;
            }
            else break;
        }
        heap[v] = heap[0];
    }
public:
    MyHeapByHand(int n) {
        len = 0;
        heap.resize(n + 1);
    }
    void push(int val) {
        heap[++len] = val;
        for (int v = len; v > 1; v /= 2) {
            if (heap[v] < heap[v / 2])swap(heap[v], heap[v / 2]);
            else break;
        }
    }
    int pop() {
        swap(heap[1], heap[len--]);
        adjustHead(1);
        return heap[len+1];
    }
};

字符串

x = atoi(str.c_str());
int stoi( const std::string& str, std::size_t* pos = nullptr, int base = 10 );
isalnum(int ch), isdigit()
std::to_string(数字)
reverse(str.begin(), str.end());

位运算

n&(n-1)其运算结果恰为把n的二进制位中的最低位的1变为0之后的结果。

异或运算满足交换律a^b=b^a、结合律(a^b)^c=a^(b^c),且a^a=0

可能犯的错误

1,注意whileif
2,注意赋值=与判等==

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值