算法刷题知识点总结

  1. 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。在这里插入图片描述

  2. 二分法:采用两个指针,注意他们的区间划分;

  3. 双指针法,用于查找排序:双指针将一个两层循环转化成了一层循环,时间复杂度也从n^2变成了n,那么什么时候会需要使用双指针呢?
    一般来讲,当遇到需要对一个数组进行重复遍历时,可以想到使用双指针法

  4. 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};
  1. 虚拟头节点便于操作;
  2. 哈希表:了解熟练使用哈希表函数进行操作:,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
    但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。
    在这里插入图片描述
  3. 对数字的位数进行求解
while (n) {
            sum += (n % 10) ;
            n /= 10;
        }
  • 交换元素swap(s[i],s[j]);
  • 反转字符:reverse(a, a+n);//n为数组中的元素个数
  • 前缀表:前缀和是指某序列的前n项和;前缀和的最主要目的就是求子数组的和的大小
  • 栈和队列:stack queue基本操作如下
    栈的下列操作
    push(x) – 元素 x 入栈
    pop() – 移除栈顶元素
    top() – 获取栈顶元素
    empty() – 返回栈是否为空
    队列的下列操作:
    push(x) – 将一个元素放入队列的尾部。
    pop() – 从队列首部移除元素。
    peek() – 返回队列首部的元素。
    empty() – 返回队列是否为空。
  • 二叉树的遍历:迭代遍历,递归遍历,遍历顺序前中后,迭代遍历采取stack先进先出,建议递归遍历,之后还有层序遍历
  • 回溯算法用于解决特定条件的匹配问题
    组合问题:N个数里面按一定规则找出k个数的集合
    切割问题:一个字符串按一定规则有几种切割方式
    子集问题:一个N个数的集合里有多少符合条件的子集
    排列问题:N个数按一定规则全排列,有几种排列方式
    棋盘问题:N皇后,解数独等等

判断一个数是质数(素数)C++

bool isprime(int num){ //判断一个数是否是素数
    for(int i = 2; i * i <= num; i++){ //遍历到根号num
        if(num % i == 0) //检查有无余数
            return false;
    }
    return true;
}

时间复杂度O(sqrt(n))。

stable_sort

当指定范围内包含多个相等的元素时,sort() 排序函数无法保证不改变它们的相对位置。那么,如果既要完成排序又要保证相等元素的相对位置,该怎么办呢?可以使用 stable_sort() 函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于LeetCode,我可以提供一些指导和建议。LeetCode是一个非常受欢迎的在线编程平台,提供了大量的编程目,涵盖各种算法和数据结构的知识点。 要有效地LeetCode目,以下是一些建议: 1. 熟悉常见的数据结构和算法:在开始之前,你需要对常见的数据结构(如数组、链表、栈、队列、树等)和算法(如排序、查找、递归、动态规划等)有一定的了解。 2. 顺序:可以按照目的难度或者类型进行。刚开始可以选择一些简单的目,逐渐提升到中等和困难难度的目。另外,可以按照目类型进行分类,比如数组、链表、树等。 3. 目分析:在开始解之前,仔细阅读目,并理解问的要求。可以考虑一些边界情况和特殊情况。 4. 设计合适的解决方案:根据目要求,设计出符合要求的解决方案。可以先在纸上画图或者写伪代码,再实现代码。 5. 编写高质量的代码:编写代码时,注意代码的可读性、可维护性和效率。可以考虑使用适当的数据结构和算法来优化代码。 6. 调试和测试:编写完代码后,进行调试和测试,确保代码能够正确地解决问。 7. 多解法比较:对于一道目,可以尝试不同的解法,比较它们的优劣,并分析其时间复杂度和空间复杂度。 8. 学习他人的解法:在过程中,可以参考他人的解思路和代码,并学习其中的优秀之处。 9. 计划:可以制定一个计划,每天或每周一定数量的目,并坚持下去。 10. 总结和复习:在过程中,及时总结自己的思考和解过程,对于一些常见的算法和技巧进行复习和加深理解。 希望以上的建议对你有所帮助。祝你在LeetCode中取得好成绩!如果你有其他问,也欢迎继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值