
算法
文章平均质量分 79
这里有我在算法学习过程中的一些思考和方法,包括了题目详解和算法介绍
ZH-Won
Practice Makes Perfect.
展开
-
【算法】动态规划练习(一)
泰波那契序列Tn定义如下:T0= 0, T1= 1, T2= 1, 且在 n >= 0的条件下 Tn+3= Tn+ Tn+1+ Tn+2给你整数n,请返回第 n 个泰波那契数Tn的值。原创 2024-04-07 21:27:34 · 1503 阅读 · 20 评论 -
【Leetcode】接雨水(双指针、单调栈)
题目描述给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。原创 2024-01-21 17:37:30 · 1174 阅读 · 34 评论 -
基本排序算法
冒泡排序,又被称为气泡排序或泡沫排序。它会遍历若干次要排序的数列,每次遍历时,会从前往后一次比较相邻两个数的大小,如果前者比后者大,则交换它们的位置,如果后者比前者大,则继续遍历。这样,一次遍历之后,数组中最大的元素就会处于数组的末尾。同理,第二次遍历后,数组第二大的元素则会处在最大的元素前一位。重复上述操作,知道整个数组有序为止。选择数组中的一个数作为基准值,通过一趟排序将整个数组分为两个部分,其中一部分的数据都比这个基准值小,另一部分的数据都比这个基准值大。原创 2023-11-09 21:00:43 · 231 阅读 · 14 评论 -
归并排序详解
分解为多个小区间可以看到这种结构很像一棵完全二叉树,分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。合并相邻有序子序列归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)空间复杂度:O(N)稳定性:稳定。原创 2024-01-19 15:08:22 · 612 阅读 · 51 评论 -
【排序算法】冒泡排序、选择排序
【排序算法】冒泡排序原创 2023-08-21 14:29:36 · 80 阅读 · 2 评论 -
深入理解——快速排序
然后将R和L对应的数交换,当R和L相遇时,将R和L对应的数与key交换,最终使得比key大的数都在key的右边,比key小的数都在key的左边。在递归到较小区间时,如果仍然使用快速排序,会造成时间上的浪费,假如这个区间内有7个数,那就要递归7次才能得到这个7个数的有序序列。,此时它们所对应的位置一定是一个坑,然后再将key填入到坑中,此时key左边的数一定比它小,key右边的数一定比他大。所谓三数取中法,其实取的是三个数中的中位数,将这个数作为基准值,能够避免某些极端情况的出现(比如数组已经接近有序)。原创 2023-12-17 21:27:32 · 1113 阅读 · 34 评论 -
深入理解希尔排序
希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的 希尔排序的时间复杂度都不固定:一般来说,希尔排序的时间复杂度是O(N^1.3)左右。代码实现与解释先写出一趟排序每趟排序都需要先分组,然后在组内进行插入排序。原创 2023-12-10 11:12:46 · 655 阅读 · 4 评论 -
【算法】滑动窗口
在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。这个题目的暴力解法当然就是两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2),这样的解法在Leetcode上也会超时。也叫尺取法,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果,可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。滑动窗口的方法通过一个for循环来达到目的,那问题又来了,原创 2023-12-14 20:18:38 · 1286 阅读 · 18 评论 -
Top-K问题
给定一个长度为 n的无序数组nums,请返回数组中前 k 大的元素。原创 2023-12-05 10:53:27 · 544 阅读 · 8 评论 -
约瑟夫问题
约瑟夫问题:编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。下一个人继续从 1 开始报数。n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?将每个成员按照对应的编号放在数组中,然后将数组中每一个元素对应的值都初始化为一个相同的数(比如 0),然后设置一个变量记录离开的人的数量作为循环的条件。原创 2023-12-04 19:56:48 · 1230 阅读 · 2 评论 -
【Leetcode】移除后集合的最多元素数
使用unordered_set存储nums1和nums2元素统计set1,set2大小和公共元素数量初始答案为set1+set2-公共元素定义长度一半为m如果set大小大于m,答案和公共元素分别减去大于m部分返回最终答案总的来说就是利用无序集合统计元素情况,并考虑是否需要移除长度一半元素来返回最大可能元素数量。原创 2024-01-07 15:34:22 · 801 阅读 · 11 评论 -
【Leetcode】移除元素、合并两个有序数组
题目要求将两个数组合并得到的数组放在nums1中,因此,我们可以从后向前比较两个数组元素的大小,将较大的元素依次放在nums1末端。如果从前向后赋值,则可能覆盖原来nums1的元素。:使用双指针法,创建两个变量s1,s2作为数组索引,nums[s1]先遍历数组,将不等于val的值赋给nums[s2],s2再往后走。原创 2023-11-09 21:38:25 · 191 阅读 · 10 评论