算法基础 快速排序

快排

这里写图片描述
引用维基百科的定义
步骤为:

  1. 从数列中挑出一个元素,称为”基准”(pivot),
    2.重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  2. 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
  3. 递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

    思路

    其实快排的思想很是简单;一个基准,一边大一边小;到底哪里难以理解呢?
    就是他了—->原地分区 参考

简单的说,就是代码实现时比较复杂;因为递归,你总不好一直创建一个小堆,一个大堆用来储存分好区的元素吧;尤其是java,实现起来真的好烦;
所以就要使用原地分区的思路;

more >>

剑指Offer 28 *字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

思路

参考
1.第一种是递归的想法;全排列就是从第一个数字起每个数分别与它后面的数字交换。听起来很难懂,反正我一看就懂了,但是还是不知道递归内部是怎么做的;
我们先看一下核心代码

more >>

剑指Offer 26 复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

思路

方法一:map关联
首先我们就是创建一个新的结点,然后就next,next这样复制;等于把原链表不包括随机访问的部分都复制了,那么问题来了,如何复制random呢?我们在复制next的时候,将原表与新表建立hash表;这样复制出的结点可以通过hashmap,找到旧结点的random;

more >>

剑指Offer 25 *二叉树中和为某一值的路径

题目描述

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

思路

这道题绝对就是递归了,但是你会发现一个问题,怎么做到已经找到一条路径然后还要继续找

more >>