队列和栈
总之,你应该能够理解和比较以下几组概念:
- FIFO 和 LIFO;
- 队列 和 栈;
- BFS 和 DFS。
数组和字符串
你可能想要了解更多与数组相关的数据结构或技术。我们不会深入研究这张卡片中的大多数概念,而是在本文中提供相应卡片的链接。
- 这里有一些其他类似于数组的数据结构,但具有一些不同的属性:
字符串(已包含在本卡片中)
哈希表
链表
队列
栈
2. 正如我们所提到的,我们可以调用内置函数来对数组进行排序。但是,理解一些广泛使用的排序算法的原理及其复杂度是很有用的。
二分查找也是一种重要的技术,用于在排序数组中搜索特定的元素。
二分法的细节加细节 https://blog.csdn.net/xiao_jj_jj/article/details/106018702
玩转二分法 https://blog.csdn.net/weixin_42723548/article/details/97158737我们在这一章中引入了双指针技巧。想要灵活运用该技技巧是不容易的。这一技巧也可以用来解决:
1)同时使用两个指针来完成迭代:一个从第一个元素开始,另一个从最后一个元素开始。持续交换它们所指向的元素,直到这两个指针相遇。
2)我们使用两个指针,一个快指针 i 和一个慢指针 k 。i 每次移动一步,而 k 只在添加新的被需要的值时才移动一步。
链表中的慢指针和快指针问题
滑动窗口问题
5. 双指针技巧有时与贪心算法有关,它可以帮助我们设计指针的移动策略。 在不久的将来,我们会提供更多的卡片来介绍上面提到的这些技术,并更新链接。
递归
递归原理 递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用
https://leetcode-cn.com/explore/featured/card/recursion-i/256/principle-of-recursion/1101/
你可能想知道如何实现调用自身的函数。诀窍在于,每当递归函数调用自身时,它都会将给定的问题拆解为子问题。递归调用继续进行,直到到子问题无需进一步递归就可以解决的地步。
为了确保递归函数不会导致无限循环,它应具有以下属性:
- 一个简单的
基本案例(basic case)(或一些案例) —— 能够不使用递归来产生答案的终止方案。 - 一组规则,也称作
递推关系(recurrence relation),可将所有其他情况拆分到基本案例。
注意,函数可能会有多个位置进行自我调用。
递归本身可能会带来一些不希望看到的副作用,如堆栈溢出。
当有疑问时,写下重复出现的关系。
由于递归的递推性质与我们所熟悉的数学非常接近,用数学公式来推导某些关系总是有帮助的。通常,利用数学公式,我们可以澄清思想,揭示隐藏的重复出现的关系。
只要有可能,就应用记忆化。
动态规划
https://www.cnblogs.com/gengsc/p/7199231.html
https://baijiahao.baidu.com/s?id=1631319141857419948&wfr=spider&for=pc
https://baijiahao.baidu.com/s?id=1635388976060265522&wfr=spider&for=pc
动态规划中包含三个重要的概念,最优子结构、边界、状态转移公式。
动态规划的核心思想是把原问题分解成子问题进行求解,也就是分治的思想。
动态规划问题,大致可以通过以下四部进行解决:
1.划分状态, 即划分子问题,
2.状态表示,即如何让计算机理解子问题。
3.状态转移,即父问题是如何由子问题推导出来的。
4.确定边界,确定初始状态是什么?最小的子问题?最终状态又是什么。
常用的是2个实现套路,一个是自底向上,另外一个是自顶向下。无论是何种方式,我们都要明确动态规划的过程,把状态表示、状态转移、边界都考虑好。
1.自底向上,简单来说就是根据初始状态,逐步推导到最终状态,而这个转移的过程,必定是一个拓扑序。
2.自顶向下,也就是从最终状态出发,如果遇到一个子问题还未求解,那么就先求解子问题。如果子问题已经求解,那么直接使用子问题的解,所以自顶向下动态规划又有一个形象生动的名字,叫做记忆化搜索,一般我们采用递归的方式进行求解。
