
算法
文章平均质量分 62
lwtb
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法导论最小堆实现k路归并
问题:请给出一个时间为O(nlgk),用来将k个已排序链表合并为一个排序链表的算法。此处的n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)编程思路:假设k个链表都是非降序排列的。(1)取k个元素建立最小堆,这k个元素分别是k个链表的第一个元素。建堆的时间复杂度O(k)。(2)堆顶元素就是k个链表中最小的那个元素,取出它。时间复杂度O(1)。(转载 2016-06-28 16:53:50 · 1243 阅读 · 0 评论 -
0交换排序
import java.util.Arrays;public class SwapWithZeroSort { public static void main(String[] args) { int[] array={2,0,1}; sort(array); System.out.println(Arrays.toString(array)); } //0交换排序 pu原创 2017-09-04 21:18:46 · 2386 阅读 · 1 评论 -
剑指offer_数组中的重复数字
/*在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。直接思路:利用辅助数组,遍历原数组,每出现一个数字,将辅助数组中该数字作为下标的元素值加1,下标大于1的就是重复元素原创 2017-09-04 22:13:46 · 271 阅读 · 0 评论 -
剑指offer_字符串转整数
/*将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入+2147483647 1a33输出2147483647 0正常:字符串如何转换为数字有正负号如何处理异常:字原创 2017-09-05 09:52:01 · 262 阅读 · 0 评论 -
快速排序的递归与非递归实现
import java.util.Arrays;import java.util.Stack;class QuickSort { public static void quickSort(int[] array) { if (array==null||array.length==0) { return; } //递归算法 //quickSortCore(arr原创 2017-08-23 12:18:58 · 329 阅读 · 0 评论 -
剑指offer_把二叉树打印成多行+之字形
/*1. 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。按层次打印可以用队列,如何保证一层输出一行,进队列的时候,加标记,出队时候遇到标记则一行结束剑指offer思路:用两个变量表示当前层还未打印的节点数和下一层的节点数*/import java.util.ArrayList;import java.util.ArrayDeque;import java.u原创 2017-08-23 17:02:31 · 332 阅读 · 0 评论 -
剑指offer_不用加减乘数做加法
/*写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。剑指offer思路:位运算分三步:不进位加,相当于异或 计算进位,相当于与之后再左移一位 第一步和第二部结果相加,相加过程同前两步,直到不产生进位为止*/class Add{ public static int add(int num1,int num2) { int sum=n原创 2017-09-06 10:07:03 · 287 阅读 · 0 评论 -
剑指offer_求1+2+3+...+n
/*求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。剑指offer思路1:利用构造函数*/class Sum{ public static int n; public static int sum; Sum() { n++; sum+=n; } public原创 2017-09-06 18:13:35 · 441 阅读 · 0 评论 -
剑指offer_圆圈中最后剩下的数字
/*圆圈中最后剩下的数字思路:循环队列,但队列是线性表,删除需要移动元素对于删除操作多的需求,考虑循环链表*/class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}class LastRemaining{ //O(mn) public s原创 2017-09-06 21:37:14 · 271 阅读 · 0 评论 -
剑指offer_扑克牌顺子
/*从中抽出了5张牌,看看能不能抽到顺子,大小王可以当做任何数顺子需要满足什么条件?剑指offer:顺子需要满足排序后空缺数少于等于王的数目*/import java.util.Arrays;class IsContinuous{ public static boolean isContinuous(int [] numbers) { if (numbers==null|原创 2017-09-07 10:19:40 · 326 阅读 · 0 评论 -
剑指offer_从尾到头打印链表
/*问题:从尾至头打印链表思路:对于单链表,从头至尾遍历保存到ArrayList中,再从后向前打印,也可以使用栈来保存*/import java.util.ArrayList;class PrintListFromTailToHead{ //非递归,直接打印 public static void printListFromTailToHead(ListNode listnode原创 2017-09-07 11:57:02 · 319 阅读 · 0 评论 -
剑指offer_链表逆置
/*反转链表并输出反转后链表的头结点与从尾到头打印链表还不一样,打印不需要改变链表结构初步思路:重建链表,与原来的反向,可行吗?将节点从头到尾记录在数组或栈中,从尾到头连接起来,但是这样就成了双向链表剑指offer:在原链表上进行指针操作即可*/class ReverseList { public static void reverseList(ListNode head)原创 2017-09-07 11:58:00 · 392 阅读 · 0 评论 -
剑指offer_二叉搜索树的第k个节点
/*题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。思路:二叉搜索树按照左根右遍历是由小到大按照左根右遍历每一个结点直到第k个要考虑k大于结点总数吗?此时会返回空k不使用静态就会出错,什么时候使用静态变量,什么时候使用参数传递?此处使用参数传递的话,k是按值传递,每次递归原创 2017-08-30 16:08:33 · 259 阅读 · 0 评论 -
剑指offer_字符流中第一个只出现一次的字符
/*请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。如何理解字符流?与以前做过的int firstNotRepeatingChar(String str) 在一个字符串(1原创 2017-08-30 16:26:15 · 477 阅读 · 0 评论 -
剑指offer_第一个只出现一次的字符
/*在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置*/import java.util.ArrayList;import java.lang.Character;class FirstNotRepeatingChar{ public static int firstNotRepeatingChar(String str)原创 2017-08-30 22:38:40 · 203 阅读 · 0 评论 -
剑指offer_表示数字的字符串
/*请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路:正负号只能出现在开头第一个或者指数第一个即E或者e之后第一个,"+-5" pass只能由数字或者E或者e组成,"1a3.14"原创 2017-09-02 20:29:45 · 461 阅读 · 0 评论 -
剑指offer_正则表达式匹配
/*请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。思路:从左到右,逐个匹配判断:若*(pattern+1) == '*', 若*pa原创 2017-09-02 20:58:04 · 430 阅读 · 0 评论 -
剑指offer_数据流中的中位数
/*如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路1:采用ArrayList存储元素,每次添加一个元素就进行排序,排序调用Collections的sort函数,时间复杂度O(nlgn)排序后的ArrayList可以在O(1)得到中位数剑指原创 2017-08-22 22:35:34 · 250 阅读 · 0 评论 -
Java数组去重的多种方法
/*数组去重1:遍历数组,将元素依次添加进结果集中,如果结果集中已经存在,则不再添加,O(n*n)2:如果知道元素范围,比如是字母,或者数字在固定范围内,可以采用辅助数组,辅助数组下标是去重数组的元素,辅助数组元素时去重数组元素的个数,O(n)3:先将原数组排序,在与相邻的进行比较,如果不同则存入新数组4:利用HashSet集合无序不可重复的特性进行元素过滤5:TreeSe原创 2017-08-22 21:02:45 · 17292 阅读 · 0 评论 -
剑指offer_链表中环的入口节点
/*一个链表中包含环,请找出该链表的环的入口结点。已知的关于环的知识点:环在末尾用快慢指针可以判断是否包含环,快慢指针能遇见则包含如果一个结点不在环上但它的下一个结点在环上,则下一个结点是入口节点如何判断一个结点在不在环上?结点在环上的话好判断,因为走一圈还可以再遇到,遇到就返回true不在环上的话,怎么判断?在环上走一圈没遇到就结束,认为不在环上,如何判断已经走了一圈?先找原创 2017-08-25 16:25:12 · 235 阅读 · 0 评论 -
贪心算法之区间图着色问题
CLRS 16.1-3 假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室。(这个问题也被成为区间图着色(interval-graph coloring)问题。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的颜色均不相同,所需的最少颜色对应于找出调度给定的所有活动所需转载 2016-07-10 12:09:21 · 7648 阅读 · 0 评论 -
贪心算法之汽车加油问题
场景一、一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。应在哪些加油站停靠加油,使沿途加油次数最少。汽车行驶过程中,不到万不得已不加油,应走到自己能走到并且离自己最远的那个加油站,在那个站加满油后,将那个加油站作为新的起点,再按照同样的方法递归下去。场景二、在一个固定长度的路线上,有多个加油站,而且各个加油站的油价不总是相同,现让油箱为空的一辆车行驶完这条路线,怎样能使所花费的油钱转载 2016-07-10 17:01:14 · 5919 阅读 · 0 评论 -
算法之最长递增子序列
一、求序列的最长递增子序列长度。构造递归方程,求最优解的值,即最长递增子序列的长度。上述F(i)是以ai结束的最长递增子序列的长度,在所有的F(i)中选最大的,就是整个序列的最长递增子序列长度。以上算法时间复杂度为O(n*n).二、这个跟上面思路的是一样的,不过是比较详细,加了构造最优解的过程。1,求最长递增子序列长度。求解以a[i]为末元素的最长递增子序列时,首先转载 2016-07-10 09:35:26 · 796 阅读 · 0 评论 -
求连续子数组的最大和
求连续子数组的最大和整理自 http://blog.youkuaiyun.com/v_JULY_v/article/details/6444021求子数组的最大和题目描述:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10转载 2016-06-20 23:04:59 · 1145 阅读 · 0 评论 -
斐波那契数列解楼梯走法问题
/*题目描述N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。(要求采用非递归) 输入描述:输入包括一个整数N,(1输出描述:可能有多组测试数据,对于每组数据,输出当楼梯阶数是N时的上楼方式个数。输入例子:4输出例子:5解法:一次可以走两阶或一阶,N = 1的时候只有一种方法。N = 2的时候有两原创 2017-03-29 16:32:28 · 2963 阅读 · 0 评论 -
采用归并排序思想解决逆序对数问题
//归并排序+解逆序对数问题class MergeSort { static int count=0; public static void mergeSort(int[] arr,int p,int r) { if (p<r) { int q=(p+r)/2; mergeSort(arr,p,q); mergeSort(arr,q+1,r); merg原创 2017-04-05 22:20:34 · 406 阅读 · 0 评论 -
堆排序
class HeapSort { //堆排序 public static void heapSort(int[] arr) { buildMaxHeap(arr); int heapSize=arr.length-1; for (int i=heapSize;i>0 ;i-- ) { swap(arr,0,i); heapSize--; maxHeapfy原创 2017-04-05 22:56:57 · 273 阅读 · 0 评论 -
剑指offer_根据前序和中序确定二叉树
/*重建二叉树:根据前序和中序确定二叉树思路:递归,找到前序的第一个元素在中序中的位置,该位置之前的元素均为左子树,该位置之后的元素均为右子树,递归处理左右子树*/class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }原创 2017-06-05 20:32:18 · 427 阅读 · 0 评论 -
剑指offer_用两个栈实现队列
/*用两个栈实现队列:要做到先进先出,stack2作为辅助栈:把第一个栈中的元素按照先进后出顺序取出放入第二个栈中,再从第二个栈中弹出来,如此便做到了先进先出;再将弹出完毕的stack2中剩余元素放回stack1;**/import java.util.Stack;class QueneWithTwoStacks { public static Stack stack1原创 2017-06-05 21:36:56 · 229 阅读 · 0 评论 -
剑指offer_调整数组顺序使得奇数位于偶数前面
/*输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。*/class ReOrderArray { public static int[] reOrderArray(int[] arr) { int[] temp=new int [arr.length];原创 2017-06-11 11:57:32 · 224 阅读 · 0 评论 -
剑指offer_机器人的运动范围
/*机器人的运动范围:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路1:应该是求最原创 2017-08-18 12:29:59 · 303 阅读 · 0 评论 -
剑指offer_对称二叉树
/*请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。剑指offer思路:如果二叉树按照根左右和根右左遍历得到的顺序是一样的,则二叉树是对称的如果树的结点值全部相同,根左右和根右左遍历得到的顺序是一样的,但树可能是不对称的,此时需要将null结点也考虑进去*/public class TreeNode { int原创 2017-08-24 21:26:18 · 250 阅读 · 0 评论 -
剑指offer_二叉树的下一个节点
/*给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:根据给出结点找到根节点,再进行中序遍历,中序遍历过程添加next指针本地运行正确,但是在牛客网上运行出错,为什么?与面试题27将二叉搜索树转换为排序的双向链表类似,中序遍历的过程添加指针变成双向链表*/class TreeLinkN原创 2017-08-24 22:25:02 · 335 阅读 · 0 评论 -
剑指offer_矩阵中的路径
/*请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c es f c sa d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字原创 2017-08-22 10:12:21 · 231 阅读 · 0 评论 -
剑指offer_滑动窗口的最大值
/*给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],原创 2017-08-22 15:53:41 · 350 阅读 · 0 评论 -
剑指offer_删除链表中重复的节点
/*在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:遍历链表,判断当前结点的下一个结点是否与当前结点相同,若不相同则继续遍历下一个结点,若相同则找到下一个不相同的结点,中间的全部删除考虑头结点重复怎么办*/class DeleteDuplicat原创 2017-08-25 15:59:35 · 377 阅读 · 0 评论 -
剑指offer_构建乘积数组
/*给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。双层for循环,外层求B[0,1,...,n-1],内层分别求A[0]*A[1]*...*A[i-1]和A[i+1]*...*A[n-1]*/class Multiply{ /原创 2017-09-03 13:21:46 · 240 阅读 · 0 评论