算法题整理(蓝桥 & leetcode)(待更新)

算法题整理(蓝桥 & leetcode)(待更新)

Note:根据 CSDN算法技能树 整理的算法题,这里仅收录一些有意思的题目。可以填空作答,阅读并理解算法。关于算法的时间复杂度计算参考 算法时间复杂度计算

一、蓝桥杯(基础)

二、蓝桥杯(简单)

三、蓝桥杯(字符串)

四、蓝桥杯(递归)

五、蓝桥杯(堆栈/队列/链表)

  • 堆的计数(考查动态规划,注意完全二叉树中父节点( i i i)的左(索引为 2 ∗ ( i + 1 ) − 1 2 *(i + 1) - 1 2(i+1)1 )右(索引为 2 ∗ ( i + 1 ) 2 * (i + 1) 2(i+1))孩子下标与数N的关系),可参考蓝桥杯第九届javaB组–第十题–堆的计数问题–动态规划乘法逆元求组合数乘法逆元概念 & 4种解法【洛谷日报#205】在取模下的乘法逆元
    Note
    • 使用动态规划可以将堆的计数问题划分成多个重叠的子问题,在使用动态规划时要考虑完全二叉树的性质:根节点确定,左子树节点个数lsize = N − 2 f l o o r ( l o g 2 N ) − 1 N - 2^{floor(log_{2}N) - 1} N2floor(log2N)1,比如数组长度为5时,根节点的左子树lsize = 5 - 2 = 3;当数组长度为9时,根节点左子树lsize = 9 - 4 = 5
    • 假设d[i]是以完全二叉树i号位置为根结点的二叉子堆个数,我们需要从n-1个节点中选出lsize个节点放入左子树,选法一共组合数C(n-1,lsize)种,剩余的放在右子树中,所以d[i]=C(n-1,lsize)*d[i的左儿子]*d[i的右儿子]
    • 百度百科中给出了乘法逆元的定义:逆元素是指一个可以取消另一给定元素运算的元素。使用快速幂法可以求解乘法逆元。
      • 比如要求 2 2 2关于模 7 7 7下的乘法逆元, 2 2 2 7 7 7的最大公因数为 1 1 1则有解;接着 2 7 − 1 ≡ 1 ( % 7 ) 2^{7 - 1} \equiv 1(\%7) 2711(%7),则 2 ∗ 2 5 ≡ 1 ( % 7 ) 2 * 2^5 \equiv 1(\%7) 2251(%7),则 2 2 2关于模 7 7 7下的乘法逆元为 2 5 = 32 2^5 = 32 25=32,检验 64 % 7 ≡ 1 64 \% 7 \equiv 1 64%71
      • 比如要求 3 3 3关于模 7 7 7下的乘法逆元, 3 3 3 7 7 7的最大公因数为 1 1 1则有解;接着 3 7 − 1 ≡ 1 ( % 7 ) 3^{7 - 1} \equiv 1(\%7) 3711(%7),则 3 ∗ 3 5 ≡ 1 ( % 7 ) 3 * 3^5 \equiv 1(\%7) 3351(%7),则 3 3 3关于模 7 7 7下的乘法逆元为 3 5 = 243 3^5 = 243 35=243,检验 749 % 7 = 1 749 \% 7 =1 749%7=1
      • 通过乘法逆元求解带模的组合数的公式为C(n,m)=n!*inv[m!]*inv[(n-m)!](其中:inv表示逆元)。假设组合数 18 2 \frac{18}{2} 218关于模 7 7 7的表示为 18 2 % 7 = 2 \frac{18}{2} \% 7 = 2 218%7=2,则通过求解分母 2 2 2的乘法逆元 32 32 32,我们可以将上式子等价为 18 ∗ 32 % 7 = 576 % 7 = 2 18 * 32 \% 7 = 576 \% 7 = 2 1832%7=576%7=2
  • JZ23 链表中环的入口结点(有环)
    Note
    • 设置快慢指针,两指针同时从头指针出发,慢指针步长为1,快指针步长为2,找到第一次相遇的节点(第一次相遇的节点并不一定是入口节点)
    • 由于慢指针走了X+Y步,快指针走了2(X+Y)步,而快指针在环路内重复走了两次Y,因此可以设置两个指针,分别从第一次相遇的节点头指针同步出发,再次相遇的节点为入口节点。
    • 注意考虑链表无环的用例
  • JZ77 按之字形顺序打印二叉树(看题解)
    Note
    • 使用队列依次存储i层的节点;
    • 在插入第i层某节点的左右孩子节点之前,先将队列中的节点转移至栈中
    • 弹出栈顶节点,根据height = i + 1,决定是先插入左子树还是右子树。
    • 遍历结束条件为队列为空。
  • JZ54 二叉搜索树的第k个节点(使用递归或非递归(栈)对二叉搜索树进行中序遍历
  • 幸运数(注意第一个幸运数都是从1开始的),可参考蓝桥杯 幸运数(Java)
    Note
    • 假设(m = 1,n = 9)1,2,3,4,5,6,7,8,9
      1)第一个幸运数为1,以2开始整除索引,得到1,3,5,7,9
      2)第2个幸运数为3,以3开始整除索引,得到1,3,7,9
      3)第3个幸运数为7,以7开始整除索引,数列不变则结束
      因此m = 1 ~ n = 9之间有2个幸运数
    • 整体思路是第一层循环用于判断幸运数是否大于数列长度,第二层循环用于将删除掉的索引进行赋值-1占位(省去了数组删除操作带来的开销)

六、蓝桥杯(模拟)

七、蓝桥杯(搜索)

八、蓝桥杯(动态规划)

九、leetcode(数组)

十、leetcode(链表)

十一、leetcode(字符串)

十二、leetcode(栈与队列)

十三、leetcode(排序算法)

十四、leetcode(双指针)

十五、leetcode(树)

十六、leetcode(哈希表)

十七、leetcode(图与搜索)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值