
算法
CYD、孤狼
没有搞不定的,只有进行中的…
展开
-
最长连续序列 --- 线性表
【描述】给定一个未排序的整数数组,求序列中最长连续元素的长度。例如,给定[100,4,200, 1, 3, 2],最长的连续元素序列是[1, 2, 3, 4].返回长度:4算法应该在O(n)复杂度下运行;【分析】针对无序数组中查询最长连续元素的问题,一般情况下先对数组进行排序处理,然后进行最长连续元素查询,以上算法的时间复杂度可以控制在O(nlogn),此处要求时间复杂度为O(n),所以需要采用其他算法;针对无序数组查询最长连续元素,不进行排序的情况下,可以采用查询的方法进行判断数组原创 2021-03-28 23:30:52 · 139 阅读 · 0 评论 -
两个排序数组的中值 --- 线性表
【描述】有两个大小分别为m和n的排序数组A和B,找到两个排序的中间值数组。总体运行时复杂度应该为O(log(m + n));【分析】这是一道很不错的例题,就如给定两个已经排序好的数组,找到两者所有元素中的第k大的元素;O(m+n)的算法比较只管,直接merge两个数组,然后求第k大的元素。不过只是需要第K大的元素,没有必要进行排序求取。可以使用一个计数器和两个指针就可以解决,此处就不进行详细解说(如果想知道详细思路,请评论区留言)。寻找较优算法,我们可以从k出发。还有一点,我们应该充分利原创 2021-03-28 00:29:50 · 239 阅读 · 0 评论 -
在旋转数组中查找指定值(2)--- 线性表
【描述】跟进“在旋转排序数组中搜索”:如果运行重复怎么办?这会影响运行时的复杂度吗?如何以及为什么?编写一个数组来确定给的目标是否在数组中;【分析】1. 允许重复元素,则上一题中如果arr[start] <= arr[mid],那么[start, mid]为递增序列的假设就不能成立了,比如[1, 3, 1, 1, 1];2. 如果arr[mid] >= arr[start]不能确定递增,那就把他拆为两个条件:1> 若arr[mid] > arr[start原创 2021-03-27 21:40:53 · 161 阅读 · 0 评论 -
在旋转数组中查找指定值(1)--- 线性表
【描述】假设旋转数组在您实现不知道的某个轴上旋转,如[0, 1, 2, 3, 4, 5, 6, 7],旋转之后[4, 5, 6, 7, 0, 1, 2, 3];您将获得一个搜索的目标值,如果在数组中找到,则返回其索引,否则返回-1;您可以假设数组中不存在重复项;【分析】主要思想为:采取二分法进行查询;1. 二分法进行查询指定目标值;2. 查询有序一半数组值,判断目标值是否在有序数组值中;不在有序数组值中,那么就在剩余一半中进行查询;注意:具体实现参考代码;【代码实现】原创 2021-03-27 21:13:24 · 354 阅读 · 0 评论 -
从排序数组中删除重复项 (2)--- 线性表
【描述】进一步处理“删除重复项”:如果最多允许重复两次怎么办?例如,给定排序数组A=[1, 1, 1, 2, 2, 3];函数应该返回length = 5,现在A是[1, 1, 2, 2, 3]【分析】1. 异常情况处理,数组长度不大于0;2. 使用两个变量(index, num),一个变量(index)进行标记新数组下标,另一个变量(num)进行标记已出现重复次数;3. 判断当前下标是否交换,交换情景如下:情景一:当前下标数组值 不等于 index下标数组值,数组值替换,并原创 2021-03-27 19:19:36 · 124 阅读 · 0 评论 -
从排序数组中删除重复项 (1)--- 线性表
【描述】给定一个排序的数组,在适当的位置删除重复项,使每个元素只出现一次,并返回新长度。不要为另一个数组分配额外的空间,您必须使用固定内存就地执行此操作。例如:给定输入数组A=[1,1,2],函数应该返回length = 2,现在A是[1, 2]【分析】1. 异常情况处理,如数组长度不大于0;2. 使用一个变量记录目前数组不重复项个数;3. 算法分析:时间复杂度为 O(n),空间复杂度O(1);【代码实现】注意:需要测试用例,评论留言;//demo.h原创 2021-03-27 19:18:01 · 140 阅读 · 0 评论