数据结构和算法
大号小白兔
One's life must be matter
展开
-
单链表----定义、增加节点、删除节点、遍历输出(java)
单链表的结构比较简单,图示如下: 单链表有很多个节点构成。每个节点由指针域和数值域构成,指针指向下一个节点的数值域。最后一个节点的指针指向的是NULL。java实现单链表的一些基本的操作:package test;import javax.xml.soap.Node;/** * 单链表的创建和增删改查 * @author duola */public class SingleLink原创 2016-04-19 16:25:39 · 2633 阅读 · 0 评论 -
最大公共子序列--动态规划
求两个序列的最大公子序列,比如说a=”12398”,b=”238”最大公共子序列,不要求连续。使用动态规划的方式进行求解,用一个二维矩阵c[i][j]表示序列1的前i位和序列2的前j位的最大公共子序列,如果a[i]==b[j]那么从c[i][j]=c[i-1][j-1]+1;否则c[i][j]=max(c[i-1][j],c[i][j-1]).最后求得的矩阵中的最大值就是最大公共子序列的长度,然后可原创 2016-06-22 16:11:23 · 482 阅读 · 0 评论 -
最大子序列和
最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序列。package string原创 2016-06-22 11:00:37 · 563 阅读 · 0 评论 -
排序算法---堆排序
堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。堆排序的排序思想: 利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。1原创 2016-07-05 17:35:27 · 513 阅读 · 0 评论 -
求裴波那契数列的第n项---递归+改进
裴波那契数列的第n项,可以很简单的使用递归,但是递归很多层之后有可能会造成栈溢出,而且速度也不一定会快。只是方法简单了,当面临大量的计算层数的时候递归并不是很好的选择。改进方法就是保存每次计算的结果,下一次计算的时候可以调用。package others;import stringTest.replaceBlank;import SortTest.insertSortTest;/** * 求裴波原创 2016-06-02 11:13:40 · 3461 阅读 · 0 评论 -
调整数组顺序使得奇数位于偶数前面
使用双指针,一个从头开始,一个从尾部开始,若第一个遇到偶数,且第二个遇到奇数则互换,结束的条件就是指针相遇。package twoPointer;public class jishuoushi { private static void change(int[] a) { if (a.length == 0 || a == null) { return;原创 2016-06-06 20:10:50 · 421 阅读 · 0 评论 -
删除链表的结点---o(1)
删除链表的节点,只允许访问这个结点,可以使用将这个结点的next指向结点的next.next.同时相应的val值换成结点的next的值就可以了。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x)原创 2016-06-06 19:55:20 · 326 阅读 · 0 评论 -
常用算法---动态规划算法
一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的转载 2016-06-27 16:17:47 · 452 阅读 · 0 评论 -
打印1到最大的n位数
题目:输入一个数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,输出1,2,3。。。。。999。 常规的想法就是求出最大的那个数,然后遍历输出。但是当n非常大的时候就无法这么做了,可以考虑数组存储。实际上是一个全排列问题。package others;/** * 输入一个数字n,按顺序打印出从1到最大的n位十进制数 * * @author duola * */public c原创 2016-06-06 10:28:31 · 406 阅读 · 0 评论 -
常用算法---分支算法
一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小转载 2016-06-27 16:14:32 · 1928 阅读 · 0 评论 -
最大公共子串--动态规划
和最大公共子序列类似,都是采用的是动态规划,不同的是,连续的串不需要判断不相等情况下的求最大,只需要判断相等即可,然后更新最大长度和每个序列的起始位置。package stringTest;/** * 最大公共子串 * @author duola * */public class lcs2 { public static String lcs2(String s1,String s原创 2016-06-22 16:46:06 · 479 阅读 · 0 评论 -
最大递增子序列--动态规划+二分
转自:https://www.felix021.com/blog/read.php?1587最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS。 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了。假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5。 下面一步一步试着找出它。 我们定义转载 2016-06-22 20:40:18 · 471 阅读 · 0 评论 -
剑指offer ---java版本
面试题3 二维数组的查找 public static boolean find(int [][] a,int val){ if(a==null) return false; int rows=a.length; int colums=a[0].length; int i=0,j=colums-1; while(i原创 2016-08-30 10:26:29 · 2076 阅读 · 0 评论 -
二叉树的面试题目总结
主要涉及:二叉树的遍历、路径和、翻转、镜像、子树、和链表转换1。二叉树的先序遍历 List<Integer> res=new ArrayList<Integer>(); public static List<Integer> preOrder(TreeNode root){ if(root==null) return res; res.add(root原创 2016-09-16 16:04:29 · 1107 阅读 · 2 评论 -
二分查找的最全版本
package SearchTest;public class binarySearch { //不分先后的查找 public static int binarySearch0(int [] a,int left,int right,int val){ if(left>right||a==null) return -1; while(left<=righ原创 2016-08-24 20:29:41 · 706 阅读 · 0 评论 -
排序
数组的快速排序 nlogn 空间复杂度为log(n) public static int partion(int [] a,int from,int to){ if(a==null) return -1; int base=a[from]; while(from<to){ while(from<to&&a[to]原创 2016-09-01 21:54:01 · 716 阅读 · 0 评论 -
利用两个栈实现队列---入队和出队
栈是先入后出,队列是先入先出。根据这个思想,可以用一个栈作为入队,另一个栈作为出队。只要把第一个栈的栈顶的元素压入第二个栈就好了,出队的时候输出第二个栈的栈顶,如果第二个栈的空了就需要不断操作从第一个栈的栈顶压入第二个栈,但是如果第一个栈也空了,那就说明所有元素都输出来了。package stackAndQuence;import java.util.Stack;/** * 使用两个栈实现队列,出原创 2016-06-01 10:11:01 · 4678 阅读 · 0 评论 -
链表的倒数第K个结点--双指针
找到单链表中倒数第k个结点。解题思路是双指针,第一个指针从头向尾部一定k-1位,然后这时候第二个指针再从头部开始移动,当第一个指针移动到尾部的时候,第二个指针指的位置就是倒数第K个。这里需要考虑一些特殊情况,比如头结点为空、k==0、k>链表中的结点数。还需要注意一点的就是倒数第k个,k是从1开始的。/** * Definition for singly-linked list. * publi原创 2016-06-06 22:01:51 · 529 阅读 · 0 评论 -
顺时针打印二维数组---执行判断
将一个二维数组顺时针进行打印,如图所示, 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 打印出来是:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。思路:打印分为四步:从左到右,从上到下,从右到左,从下到上。第一步是肯定会执行的,到达列数时开始执行第二步,第二步能够执行的条件终止行号大于起始行号,第三步打印的前提条件是圈内至少有原创 2016-06-16 14:50:12 · 1373 阅读 · 0 评论 -
二叉树的层次遍历输出
从上到下层次遍历二叉树,并打印输出,使用的是队列,依次存储,输出的时候先把队首输出,同时去除队首元素。 上代码:package binaryTree;import java.util.LinkedList;import java.util.Queue;/** * 二叉树的层次遍历,使用队列 * * @author duola * */public class cengcibianl原创 2016-06-23 16:09:56 · 2616 阅读 · 0 评论 -
给定入栈顺序,判断出栈顺序是否合法
给定一个入栈顺序,判断出栈顺序是否有可能发生,所遵循的方法是使用一个辅助栈记录入栈的元素,当刚开始时候辅助栈为空,入栈元素第一个压入辅助栈,接下来如果看出栈顺序,如果出栈顺序的第一个元素和辅助栈的栈顶元素不相等,则继续把 入栈元素的下一个压入辅助栈;如果出栈顺序的元素和辅助栈的栈顶元素相等则直接将辅助栈的栈顶元素弹出,同时出栈序列向后移动一位。以此类推,如果当入栈元素全部进入辅助栈了,则秩序比较出栈原创 2016-06-23 14:32:20 · 2754 阅读 · 0 评论 -
数值的整数次方---考察是否考虑的全面
给定题目是求一个double类型底数的整数次方,这个题目并不难,考察的是是否能够考虑全面,一般遇到求幂次或者分数的题目,都要考虑一些特征情况。这个提米需要考虑一下几点:1、是否可以任意的输入,如果不是非法输入是什么?—非法输入就是当底数为0,指数为负数的时候。2、底数是一个double型,判断是否为零,是否可以用==?—-计算机在表示小数的时候有误差,不能直接用==这个符号,要写一个函数判断,可以设原创 2016-06-06 09:25:26 · 463 阅读 · 0 评论 -
常用算法----回溯算法
1、概念回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用转载 2016-06-27 10:43:22 · 624 阅读 · 0 评论 -
字符串转整形--java
package test;import java.awt.geom.FlatteningPathIterator;/** * 字符串转换成整数,需要考虑几种情况: 是否会溢出;-2147483648,+2147483647 有没有非法字符,非数字; * * @author duola * */public class StringToInt { private原创 2016-05-03 13:17:22 · 611 阅读 · 0 评论 -
排序算法---直接选择排序算法
选择排序算法的过程: 从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。寻找最小的元素需要一个循环的过程,而排序又是需要一个循环的过程。算法的时间复杂度也是O(n*n)。 一共需要n次位置的交换和n^2/2次比较。空间复杂度是O(1).选择排序算法是不稳定的,比如原序列为:原创 2016-03-04 10:57:55 · 649 阅读 · 0 评论 -
排序算法---希尔排序
希尔排序属于插入排序的类别,本质上是分组插入排序。 其基本思想是: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2package test;public class ShellSortTest { static void shellsort(int[] a) {原创 2016-04-18 21:11:16 · 409 阅读 · 0 评论 -
搜索算法----二分查找(折半查找)
二分查找的先决条件:序列是有序的升序排列的。 查找的效率较高,但是只适用于有序表,且限于顺序存储结构,对线性链表无法有效的进行查找, 还有二分查找在一些特殊情况下,其查找效率很低,如查找元素是数列中的第一个元素和最后一个元素。二分查找的时间复杂度是O(log(n)),最好的情况是指针mid指的第一个数就是要找的值, 最坏的情况的所找的值是第一个或最后一个数,最坏情况下的时间复杂度是O(n)原创 2016-04-12 18:35:48 · 800 阅读 · 0 评论 -
排序算法---直接插入排序算法
直接插入排序的思想 在一个已经有序的小序列的基础上,一次插入一个元素。刚开始这个有序的小序列只有1个元素,也就是第一个元素。比较是从有序序列的末尾开始,也就是把待插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面。否则一直往前找直到找到它该插入的位置。如果遇见一个与插入元素相等的,那么把待插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序仍是排好原创 2016-04-18 12:24:50 · 688 阅读 · 0 评论 -
排序算法---二分插入排序
二分(折半)插入(Binary insert sort)排序基本思想:设在数据表中有一个元素序列v[0],v[1],v[2]……v[n].其中v[0],v[1],v[2]……v[i-1]是已经排好序的元素。在插入v[i]。利用折半搜索寻找v[i]的插入位置。二分插入排序是一种稳定的排序。当n较大时,总排序码比较次数比直接插入排序的最差情况好得多,但比最好情况要差,所元素初始序列已经按排序码接近有序时原创 2016-04-18 16:03:50 · 650 阅读 · 0 评论 -
排序算法---快速排序
思想是分治法。将数组分成2个子序列,然后独立的进行排序,和归并排序是互补的。详细描述:首先在要排序的序列 a 中选取一个基准值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于基准值,右边的部分 c 的元素 均大于或者等于基准值,而后通过递归调用快速排序的过程分别对两个部分进行排序,最后将两部分产生的结果合并即可得到最后的排序序列。快速排序在进行交换时,只是根据比较基数值判断是否交原创 2016-04-12 20:28:51 · 601 阅读 · 0 评论 -
字符串全排列
字符串全排列问题可以在需要字符串序列中选出一个字符放到第一位,然后对剩余的字符进行全排列,递归进行,可以得到所有字符的全排列,遇到有重复的字符的,只需要加一个判断即可,即判断之前是不是已经出现过了,如果已经出现过了就不做处理了。java代码:package test;public class StringQuanPaiLie { public int quanpailie(char[] lis原创 2016-04-28 11:11:26 · 454 阅读 · 0 评论 -
排序算法---冒泡排序
交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。package test;/** * 冒泡排序是将数组中相邻的2个元素进行比较,然后把比较小的放到前面。这样就是升序排序; * 把比较大的额放在前面就是降序排序。需要比较的次数是n次。 * 它适合数据规模很小的时候,而且原创 2016-04-13 11:07:21 · 669 阅读 · 0 评论 -
排序算法---归并排序
概述 归并排序是一种分治思想的排序,有2种:自上而下和自下而上。这里讨论的是自上而下的。 如下图所示: 关键步骤: 1、将数组分成2部分,middle=(low+high)/2; 1、继续对2部分把数组进行分割,使用递归直到分割成一个元素一组; 2、将已排序的两个子区间a[low…mid]和 a[mid+1…high]归并为一个有序的区间a[low…high]。时间复杂度: 归并排序的原创 2016-05-03 21:04:24 · 596 阅读 · 0 评论 -
查找算法---快速选择算法
快速选择算法,是一种能在大致O(N)的时间内选取数组中第k大或者k小的算法.其基本思路与快速排序算法类似,也是分治的思想.1 执行Partition算法(就是那个快排里将区间内所有数划分为小的一部分和大的一部分的过程) 2 判断第k大的数是在小的部分还是大的部分 3 递归,直到区间足够小,返回结果package selectTest;import javax.print.attribute.st原创 2016-05-05 15:27:56 · 873 阅读 · 0 评论 -
检测二叉树是否是另一个二叉树的子树
检测方法是先比较根节点,如果根节点相等继续比较左右子树,使用递归的方法;如果根节点不相等,则比较左子树的根节点是否和要比较的二叉树的根节点相等。package binaryTree;import java.util.regex.Matcher;import javax.security.auth.Subject;/** * 检测二叉树是否是另一个二叉树的子树 * * @author duol原创 2016-06-08 10:49:02 · 812 阅读 · 0 评论 -
算法和数据结构常考知识汇总--链接
面试10大算法汇总+常见题目解答 http://itindex.net/detail/47063-%E9%9D%A2%E8%AF%95-%E7%AE%97%E6%B3%95二叉树的详细讲解 http://www.cnblogs.com/manji/p/4903990.html面试准备之常见排序算法的总结 http://blog.csdn.net/kkkkkxiaofei/article/det原创 2016-05-09 14:42:37 · 659 阅读 · 0 评论 -
从尾到头打印单链表
使用递归进行从尾到头打印链表。java代码public class ListNode{ ListNode next; int val; ListNode(int x){ val=x;}public static void print_reverse(ListNode head){ if(head==null||head.next==null) System.o原创 2016-05-19 17:00:00 · 457 阅读 · 0 评论 -
排序算法---堆排序
堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。堆排序的排序思想: 利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。1)将初始待原创 2016-05-09 13:13:19 · 414 阅读 · 0 评论 -
字符串的空格替换
有一个字符串a=”we are you.”空格替换%20,常规的解法是从前往后遍历,遇到空格,替换,然后后面的元素向后移2位,以此类推,这样的时间复杂度是n2,因为会有一部分数据重复移动多次,比较好的解决方案就是先求出替换完之后,最后一个元素的位置,然后从后向前处理字符串。java代码:private static void replace(char[] test,int space) {原创 2016-05-19 15:59:21 · 370 阅读 · 0 评论 -
两个队列实现栈--出栈,入栈
栈和队列新加入元素的时候总是在最后加入,只不过队列出的时候栈顶,队列出的是队首。所以入栈就是先把元素进入队列1,出栈的时候,先判断队列1有几个元素,如果只有一个元素就直接输出这个元素就好,如果不止1个就先把队列1的n-1个元素放入队列2,然后把队列1的元素弹出,弹出后队列1就空了,如果此时还要进行出栈操作,就报队列2的n-1个元素放到队列1中然后弹出队列2的元素。package stackAndQu原创 2016-06-01 11:22:15 · 1872 阅读 · 0 评论