算法思想总结第一弹

来源:互联网 发布:php yaf文档 编辑:程序博客网 时间:2024/06/11 09:21

可能大家都有一些这样的需求:为什么算法这么难,为什么我没有一些这样那样的算法思想,我看到这个题无从下手。别人都说《算法导论》多么多么好,我怎么看不懂。这些都是通病,除非像清华北大高材生智商与逻辑思维nb,数学公式推导的无与伦比,不然谁都会觉得这个东西想不出来。其实多做些算法题然后自己总结是可以总结出一些规律,就像以前做数学题,见到提醒就想公式一样。算法确实难,尤其是那些红黑树什么的,图论很多,我现在都没有搞明白。

不过平心而论,我们的目的是找工作,赚钱,如果你单纯说我热爱它,我就想研究,那好吧,那建议你去找刘未鹏这样的大神去聊,他应该会给你点指引。既然是这样我们就说工作需要什么我们针对它做什么,就像期末考试一样,并不一定做到全会,及格了自然就入职了。

我自己做了目前刷了二十几道题后(题目来自左程云的书),有不会的照着左程云的讲解去看他写的答案代码,然后自己再试试,最后总结出一些规律,比如遇到什么字眼或者场景该用什么数据结构,该用什么思路。

下面是我暂时总结的几个小思想,对于很多人来说很皮毛,不过本人比较菜鸡,所以只好笨鸟先飞:

  1. 要利用栈的特点,可以进行顺序的颠倒。
  2. 寻找链表的中间点不一定要遍历链表找到count值,可以使用,p.next,q.next.next来定位,链表的三分之一,四份之一点等也可以利用这个思想。
  3. 根据不精确排序,即将比一个数大的归为左边,等于的数在中间,大于的数在右边。首先应该将链表数据放到数组中,因为数组功能要比链表这个
    结构更好一点。然后将小的往左边靠,从数组为0处开始向后靠;同理将大的从length-1处开始向前靠,关键点在于相等的数,相等的数要不动,
    不做处理,如果数组是从头开始遍历进行的话,相等的数会被与小的数交换的索引绑定起来,交换数的索引会一直处于等于这个数值的位置,一碰到小的数
    要交换时就会将等于的数进行交换。
  4. 碰到复制链表,链表不仅有next还有一个随机指针的这类问题,因为有随机指针,它的指向不明确,所以无法进行照着复制,那么第一个办法是用key- value形式,原链表的节点作为键,值是新建的,取值跟它一样的节点。这样连接就建好了,下一次遍历可以map.get(cur).next取到新节点的next,指向 map.get(cur.next)。总的来说关键是新旧之间建立k-v关系。第二种解法是:将旧节点直接建立在新节点之后,这样新旧节点就直接建立了一个关系, oldNode.next = newNode,这样随机节点的问题就解决了。newNode.range = oldeNode.range.next。这里的newNode替换为oldeNode.next即可。
  5. 判断链表是否有环:追逐法判断,如果快的指针追上慢的指针,那么就有环;如果没有追上说明没环。
    判断两个无环链表是否相交:遍历两个链表到最后,看最后一个节点是否相同。
    判断两个有环链表是否相交:定理是追逐第一次的相遇点与头结点到环切入点的距离相等。这样就可以算出环之外的部分,因为两个相交的有环部分一 定是相同的。
  6. 前面出现的许多值在后面都要用到来进行比较的,可以想到用hashmap来保存,键值对。get(key) 返回null说明没有这个值。
0 0