算法
打代码的小学生
所谓优势,不过是比别人多深入思考一点而已
展开
-
Leetcode 92
题目如下:Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note: Given m, n satisfy the f原创 2017-09-06 14:50:09 · 276 阅读 · 1 评论 -
贪心算法
1 贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。解题的一般步骤是:1.建立数学模型来描述问题;2.把求解的问题分成若干个子问题;3.对每一子问原创 2017-09-02 10:11:34 · 364 阅读 · 0 评论 -
斐波那契数列
1 介绍 Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n>=3。 计算第n项Fibonacci数值。2 实现/** * * @author xld * */public class FibonacciSequence { // 定义全局数组,承装斐波那契数列 private static原创 2017-09-02 10:07:48 · 336 阅读 · 0 评论 -
二分搜索树--完整版
1介绍包含二分搜索树的插入,删除,遍历,等几乎全部功能 ,如果想知道什么是二分搜索树,请查看我的上一篇博客,废话少说,上代码2 实现–完整版import java.util.LinkedList;/** * 二分搜索树 * * @author xld * * @param <Key> * @param <Value> */public class BST<Key extends原创 2017-09-01 20:21:12 · 221 阅读 · 0 评论 -
二分搜索树
1 什么是二分搜索树二分搜索树,也叫二叉查找树(Binary Search Tree),有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉原创 2017-09-01 20:02:08 · 192 阅读 · 0 评论 -
二分查找
1 算法分析 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5<6,则6必然在5之后原创 2017-09-01 14:24:26 · 196 阅读 · 0 评论 -
索引堆
1 原理 堆(heap)是一种常见的数据结构,经常用来实现优先队列。其中最常见的是二叉堆(binary heap)。由于它特殊的性质(二叉满树)所以可以用数组高效的实现。 堆还能用来进行排序,堆排序(heap sort)具有快速(复杂度O(N * logN)),稳定的特点,尤其是非常稳定,因此适用于某些需要排序稳定性的场合。 But,普通的二叉堆有两个缺陷: 1,在堆中原创 2017-09-01 13:53:19 · 224 阅读 · 0 评论 -
堆排序
1 排序原理具体什么是堆排序请自行查阅,不在此博客内容,本实例使用原地堆排序,先将数组建成一个最大堆,再将堆顶元素取出放在数组末尾。2 实现/** * 对数组进行原地堆排序 * @author xld * */public class HeapSort { /** * 原地堆排序 * @param arr */ public static vo原创 2017-09-01 09:21:01 · 166 阅读 · 0 评论 -
求数组中第n大(小)的元素
1 算法原理使用快速排序进行查找,类似于二分查找的意思,因为每次都会有一个元素找到适当位置,该位置就是这个元素在数组中的排列顺序。每次partition会返回一个数组下标,将该数组下标的元素和待查找的值进行比较,如果相等,直接返回,如果大于,取partition操作后的右一侧,反之,取左一侧。2 时间复杂度 利用快速排序进行查找,类似与二分查找思想,其操作数为n+n/2+n/4+.....原创 2017-08-31 18:43:58 · 514 阅读 · 0 评论 -
求逆序对
1 原理归并排序求逆序对 ,归并排序是将数列a[l,h]分成两半a[l,mid]和a[mid+1,h]分别进行归并排序,然后再将这两半合并起来。在合并的过程中(设l<=i<=mid,mid+1<=j<=h),当a[i]<=a[j]时,并不产生逆序数;当a[i]>a[j]时,在前半部分中比a[i]大的数都比a[j]大,将a[j]放在a[i]前面的话,逆序数要加上mid+1-i。因此,可以在归并排序中的原创 2017-08-31 16:43:32 · 174 阅读 · 0 评论 -
三路快排
1 算法原理 将数组划分为三部分,大于v,小于v和等于v,设置三个指针,优点就是无需对重复元素进行重复操作,性能有所优化2 时间复杂度O(logn*n)3 实现/** * 三路快排 * * @author xld * */public class QuickSortThreeWay { public static void sort(int[] arr) {原创 2017-08-31 15:01:59 · 297 阅读 · 0 评论 -
双路快排
1 排序原理 它是随机快速排序的优化,将小于表定点和大于表定点的元素的位置放在数组的两端,设置两个指针,指针对撞 ! 好处是将等于v的元素分散到数组的两部分,当面临大量的重复键值的情况下,可以保证不会将算法退化到O(n^2)的情况2 时间复杂度O(logn*n)3 实现/** * 双路快排 指针对撞 * * @author xld * */public class Q原创 2017-08-31 14:50:37 · 282 阅读 · 0 评论 -
快速排序 Java
1 排序原理 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。其为冒泡排序的优化2 时间复杂度O(logn*n) 最坏时间复杂度:O(n^2)3 实现/** * 快速排序 * * @author xld *原创 2017-08-31 14:17:24 · 191 阅读 · 0 评论 -
归并排序 Java
1 排序原理归并排序是分治法的一个典型应用,简单来说,归并排序分为两部分,第一部分是拆,就是将数组的长度一层一层往下拆,第二部分就是将拆好的一个一个相邻的数据进行合并,在这一步里面我们进行排序。整体思想其实非常简单 2 时间复杂度O(logn*n)正如其他的高级排序算法一样,归并排序其实也就是减少我们进行排序的重复操作。拆分的时候,采用二分的方式,所以有logn层,而每层比较的次数就是n喽,所以原创 2017-08-31 10:19:18 · 201 阅读 · 0 评论 -
选择排序
1 排序原理选择排序最符合大家对排序的原始想法,就是将待排序的数据中把最小的选出来,然后放入已经排好序的数据中,就这么简单2 时间复杂度O(n^2)选择排序的想法最简单,但是其性能也是真的不高3 代码实现/** * 选择排序算法 * @author xld * */public class SelectionSort { public static void sort(in原创 2017-08-31 09:06:10 · 183 阅读 · 0 评论 -
插入排序 Java
1 基本原理插入排序就是将未排序的数据插入到已经排序数据的适当位置,插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......第N-1次,数组前N-1个元素组成原创 2017-08-31 08:58:07 · 290 阅读 · 0 评论 -
希尔排序 Java实现
1 希尔排序原理希尔排序也成为“缩小增量排序”,其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。因此,我们要采用跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。希尔排序是对原创 2017-08-31 08:46:52 · 218 阅读 · 0 评论 -
台阶问题
1 问题描述 1. 楼梯有n个台阶,上楼可以一步上1阶,也可以一步上2阶,一共有多少种上楼的方法?斐波那契数列 第一项为1 第二项为2 也就是f(n)=f(n-1)+f(n-2),用递归求。给个分析的例子:有一个11级的台阶,一个人可走一步也可走两步,问这个人有多少种方法走完这个台阶?解:①只用一步走:1+1+1+1+1+1+1+1+1+1+1=11,共11步,只有C11,1=1种原创 2017-09-02 10:42:52 · 661 阅读 · 0 评论