算法
shanghx_123
努力成为一名优秀的程序员
展开
-
链表---删除链表的非尾结点,要求:不能遍历链表
题目描述:删除链表的非尾结点,要求:不能遍历链表,(要求事件复杂度O(1),空间复杂度O(1)) 思路: 1.先找到要删除的节点,然后将要删除的节点的下个节点的值val赋值给当前要删除节点的值 2.然后删除要删除节点的下个节点 缺陷:只能删除链表的非尾节点,不适用于节点的val很多的情况,以及链表的节点是依赖与某一种关系。 void DeleteListNotTailNode(PNode pos)...原创 2019-01-19 16:34:30 · 252 阅读 · 0 评论 -
荷兰国旗问题---按小于、等于、大于分组链表
题目描述:给定一个链表的头节点head,再给定一个数num,请把链表调整成节点值小于num的节点都放在链表的左边,值等于num的节点都放在链表的中间,值大于num的节点,都放在链表的右边。 解法一: 1.将链表的所有节点放入到数组中,然后将数组进行快排划分的调整过程。 2.然后将数组中的节点一次重新串连。 时间复杂度O(n),空间复杂度O(n) 2.解法二(最优解): 1.将原始链表分解为三个小链...原创 2019-01-19 17:57:24 · 246 阅读 · 0 评论 -
链表---打印链表公共部分
题目描述: 给定两个有序链表的头节head1和head2,打印两个有序链表的公共部分(默认升序是) 思路: 1.分别遍历两个链表,当list1的节点值和list2 的节点值相等时,打印 2.当list1的值小于list2,list1往后移动 3.当list1的值大于list2,list2往后移动 4.直到其中一个链表为空 void PrintSameNode(PNode head1, PNode ...原创 2019-01-19 19:19:46 · 593 阅读 · 0 评论 -
找到数组中超过一半和四分之一的两个数
题目描述 一个长度为size的整形无序数组,已知其中一个元素出现的次数超过size>>1,另外一个元素出现的次数超过size>>2,请找出这两个元素。要求时间复杂度O(n),空间复杂度O(1)。 思路: 这是一道CVTE的笔试题,有点和剑指Offer中找到数组中出现一半的元素那个题相似。解决思路是借鉴剑指Offer这个题。 因为时间复杂度有要求,所以不能排序,并且空间也有要...原创 2019-02-27 17:25:52 · 475 阅读 · 0 评论 -
排序算法---计数排序
计算排序 计数排序是一种非比较排序,适合待排序的数据的范围比较小,数据比较集中的情况。 如果数据范围跨度大,会导致占用的空间比较大。 时间复杂度:O(2n+数据的范围) 空间复杂度:O(数据的范围+1) 思想: 1.先找到原数组的最大最小值 2.将数组里面的值遍历一遍找到每个数出现的次数,保存在count数组里面 3.将数据按出现次数还原到原数组中 源码: #include<iostrea...原创 2019-02-23 16:01:20 · 169 阅读 · 0 评论 -
排序算法---基数排序
基数排序 思想: 1.先开辟好空间,来保存中间排好序的数据 2.统计每个个位相同的数据出现的次数,保存在count数组 3.计算每个数据要存入tmp数组的开始位置 4.将数据存放在tmp数组中 5.将排好序的数据写进原数组中 源码: #include&amp;amp;lt;iostream&amp;amp;gt; #include&amp;amp;lt;assert.h&amp;amp;gt; using namespace原创 2019-02-23 18:34:02 · 319 阅读 · 0 评论