
算法/数据结构
井底的笨鸟
Stay hungry,stay foolish.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
动态规划——连续子序列最大和
题目描述:输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。子问题为以当前元素结尾的序列最大和//递归方原创 2016-05-19 10:00:21 · 462 阅读 · 0 评论 -
二分查找——sqrtx
题目描述Implementint sqrt(int x).Compute and return the square root ofx.public class Solution { public int sqrt(int x) { if(x <= 0) return 0; int start=1;原创 2016-05-28 15:53:07 · 356 阅读 · 0 评论 -
动态规划——01背包问题
01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。01背包的状态转换方程f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。Pi......转载 2016-08-16 14:57:56 · 532 阅读 · 0 评论 -
BFS、DFS——机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?public class Sol原创 2016-05-29 14:20:07 · 3861 阅读 · 0 评论 -
DFS——矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符原创 2016-05-29 13:48:05 · 888 阅读 · 0 评论 -
动态规划——最长上升子序列
题目描述:求出一个数组最长上升子序列长度。一个数的序列bi,当b1 //递归方法:找出递推公式,即DP的状态转移方程。//k表示以data[k]结尾,mostLength求以以data[k]结尾的最长上升子序列的长度。 public int mostLength(int []data,int k) { if(k == 0) return 1; int max=原创 2016-05-19 10:29:12 · 377 阅读 · 0 评论 -
回溯法——八皇后问题 n-queens
题目描述一个8*8的棋盘上有八个皇后,使她们互相不能攻击(即两个皇后不能出现在同一行,同一列,或同一对角线上)。package TraceBack;public class 八皇后问题 { public static void main(String[] args) { // TODO 自动生成的方法存根 int []data原创 2016-05-28 21:09:04 · 508 阅读 · 0 评论 -
回溯法——正方体的八个顶点
题目描述:将1--8这八个整数放在正方体的八个顶点上,要求相对的两面上四个数之和相等。求所有放法。package TraceBack;public class 正方体的八个顶点 { public static void main(String[] args) { // TODO 自动生成的方法存根 int data[]={1,2,3,4,5,6,7,8}原创 2016-05-28 20:51:09 · 2887 阅读 · 0 评论 -
回溯法——subsets、subsets-ii数字数组的所有组合
题目描述:subsetsGiven a set of distinct integers, S, return all possible subsets.Note:Elements in a subset must be in non-descending order.The solution set must not contain duplicate s原创 2016-05-28 20:09:27 · 922 阅读 · 0 评论 -
二分查找——数字在排序数组中出现的次数
两次二分查找找到该数字的左右边界。public class Solution { public int GetNumberOfK(int [] array , int k) { if(array == null||array.length == 0) return 0; //找左边界 int left=0;原创 2016-06-14 14:31:20 · 786 阅读 · 0 评论 -
二分查找——Search Insert Position
题目:给定一个排序的数组和一个 target,若target在数组中找到,则返回下标,否则找出target要插入的index。例如: int[] array={1,3,5,6}; 5->2; 2 ->1; 7->4; 0->0.值的注意的是,跳出while后的不同情况的判断。 public int serchInsert(int[]原创 2016-07-22 08:48:28 · 312 阅读 · 0 评论 -
二分查找——Search a 2D Matrix
题目: 给定了一个矩阵,该矩阵不仅每行,每列都递增,而且每行的首位比前行的末位数字大时,可看成一位数组,利用二分查找。例如矩阵为:int[][] data={{1, 3, 5, 7}, {10,11,16,20}, {23,30,34,50}};二维矩阵与一维矩阵下标对应的关系:下标为i和j的元原创 2016-07-22 09:04:12 · 386 阅读 · 0 评论 -
回溯法——combination-sum、combination-sum-ii
题一 Combination Sum I,题目大意是这样的:有一个正整数集合C,和一个目标数T(T也为正整数)。现从C中选出一些数,使其累加和恰好等于T(C中的每个数都可以取若干次),求所有不同的取数方案。要求:所得集合元素不能降序排列,结果不能有重复的集合。 例如:C={2,3,6,7} T=7 res={ [7],原创 2016-05-31 13:27:11 · 4221 阅读 · 0 评论 -
字符串匹配——Sunday算法
学习了一个新strstr算法,sunday算法。好了,sunday算法还真的很好理解,用下面的例子来说明吧:这个例子中上面的字符串是待查找字符串,下面的是子串。sunday的思想是这样的:首先i,j两个指针指示的位置(也就是从头开始匹配),当发现失配的时候就判断子串的后一位在母串的字符(在上面的例子中是空格字符,k标记处)是否在子串中存在?如果存在则将该位置和子串中的该原创 2016-07-26 20:28:49 · 3022 阅读 · 0 评论 -
二分查找——Wood Cut
题目:给定一个数组,数组中的数字代表原木的长度,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。样例有3根木头[232, 124, 456], k=7, 最大长度为114.注意木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度原创 2016-07-22 11:03:47 · 501 阅读 · 0 评论 -
排序、数组——数组中重复的数字和first missing positive(桶排序)
题目:找到数组中不存在的第一个正整数。For example,Given[1,2,0]return3,and[3,4,-1,1]return2.要求O(N)时间复杂度,O(1)空间复杂度。解法: 若用桶排序则空间复杂度为O(N)。关于桶排序:1,桶排序是稳定的2,桶排序时间复杂度可以达到O(原创 2016-05-17 10:59:34 · 559 阅读 · 0 评论 -
各种排序算法的稳定性和时间界限分析
首先盗个图:原创 2016-08-03 12:17:49 · 315 阅读 · 0 评论 -
排序——shell排序
希尔排序又称增量排序,是对直接插入排序的一种改进,采取跳跃分割策略:将相距某个增量的记录看成一个子序列,在子序列内分别进行直接插入排序后得到的结果是基本有序的。 增量的选取非常重要,最后一个增量值必须等于1才行。 public static void main(String[] args) { int[] data={9,1,5,8,3,7,4,6,2};原创 2016-08-17 13:12:19 · 424 阅读 · 0 评论 -
二分查找——旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。import java.util.ArrayList;public class Solution {原创 2016-07-22 09:44:22 · 789 阅读 · 0 评论 -
二分查找——Find Peak Element
题目:给定一个矩阵,找出其中的峰值。矩阵满足num[i]!=num[i+1],矩阵中可能有多个峰值,返回其中之一即可(若要求出所有,则不能使用二分查找法)。另外,you may imagine that num[-1] == num[n] == 负无穷。例如:矩阵[1,2,3,1],返回3的下标2。 矩阵[1,2,3,4,5],返回5的下标4。public原创 2016-07-22 09:19:19 · 449 阅读 · 0 评论 -
卡特兰数的概念
卡特兰数,一种有着特殊规律的数列,先用一道题来引出卡特兰数。10个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问有多少种排列方式?我们可以先把这10个人从低到高排列,然后,选择5个人排在第一排,那么剩下的5个人肯定是在第二排。用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有5个0,5个1的序列,就对应一种方案。比如00000111转载 2016-07-17 17:04:12 · 380 阅读 · 0 评论 -
字符串、动态规划——最长公共子串LCS
题目描述:求字符串S,T的最长公共子串题目来源:http://blog.csdn.net/column/details/lf-algoritnote.html?&page=2字符串S,T所有前缀子串中的最长公共后缀,就是S,T的最长公共子串;(注:这里指的是前缀子串的后缀,而不是S,T的后缀!)名词含义:前缀子串:从字符串第一个字符开始的子串;后缀:后缀是指从某原创 2016-05-20 10:05:36 · 623 阅读 · 0 评论 -
动态规划——最长公共子序列
题目描述:两个字符串如"programming"和"contest"的最长公共子序列为“on”,长度为2; “abcd”和"mnp"的最长公共子序列为"",长度为0; "bcdb"和“abcbdab”的最长公共子串为“bcdb”,长度为4;注:相应的下标必须递增。如"bcdb"对应“abc原创 2016-05-19 10:49:10 · 601 阅读 · 0 评论 -
排序——计数排序
英文出处:austingwalters计数排序计数排序非常基础,他的主要目的是对整数排序并且会比普通的排序算法性能更好。计数排序对元素落在一定区间且重复值较多的情况十分有效,且需要额外O(N)空间。例如,输入{1, 3, 5, 2, 1, 4}给计数排序,会输出{1, 1, 2, 3, 4, 5}。这个算法由以下步骤组成:初始化一个计数数组,大小是输入数转载 2016-05-17 11:26:57 · 547 阅读 · 0 评论 -
回溯法——电话号码代表字符组合
题目描述Given a digit string, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like on the telephone buttons) is given below.原创 2016-05-29 15:06:21 · 833 阅读 · 0 评论 -
回溯法——字符所有组合
package TraceBack;import java.util.*;import java.math.*;public class 字符所有组合 { public static void main(String ss[]) { String str="abcd"; 字符所有组合 test=new 字符所有组合(); test.perm(原创 2016-05-28 20:08:13 · 661 阅读 · 0 评论 -
排序——归并排序
利用递归的思想,当N=1时,只有一个元素需要排序,为递归临界条件;否则,递归的将前半部分数据和后半部分数据各自归并排序,得到排序后的两部分数据,然后再将得到的两部分合并到一起。 //mergeSort algorithm public void mergeSort(int[] data) { if(data == null || data.length<2) ...原创 2016-05-16 15:51:03 · 368 阅读 · 0 评论 -
排序——简单排序算法
时间性能均为O(n*n)。//简单冒泡排序 public void bubbleSort(int []data) { if(data == null||data.length <2) { return; } boolean flag =true; for(int i=0;i<data.length-1&&true == flag;i++) { flag=原创 2016-05-16 11:37:07 · 347 阅读 · 0 评论 -
分治法——二分查找
基于循环和递归递归法: public int binary(int []data,int k) { if(data==null||data.length==0) return -1; else return binarySearch(data,0,data.length-1,k); } public int binarySearch(int []data,int原创 2016-05-27 11:16:50 · 525 阅读 · 0 评论 -
递归——整数划分问题
题目来源:http://www.cnblogs.com/dolphin0520/archive/2011/04/04/2005098.html整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi; (其中mi为正整数,并且1 例如当n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};该问题是求出n原创 2016-05-27 10:21:33 · 1531 阅读 · 0 评论 -
动态规划——基础知识
/动态规划适用于:1.有重叠子问题 2.有最优子结构性质DP通常用来求最优解,能用动态规划求最优解的问题,必须满足:最优解的每个局部解也是最优的; 相关术语:* 阶段:把所给求解过程恰当的分成若干个相互联系的阶段;* 状态:过程的状态通常可以用一个或一组数来描述,称为状态变量;* 无后效性:过程的历史只能通过当前状态去影响它未来的发展;* 决策:从该状态演变到原创 2016-05-19 09:41:54 · 502 阅读 · 0 评论 -
回溯法——字符串的全排列
题目:输出一个字符串的全排列,且重复的排列不重复输出。注:经典回溯法题目,八皇后问题,正方体的八个顶点,电话号码对应英文单词等都是一种算法;代码如下:public class TraceBack { public static void main(String []argc) { String str="abbc"; char[...原创 2016-05-09 09:29:05 · 1486 阅读 · 0 评论 -
动态规划——数字三角形最大和
题目描述:求数字三角形从顶层到底层的最大和,路径抉择时只能向下或向右下走。本题中的数字三角形:73,88,1,02,7,4,44,5,2,6,5题解:若三角形为等腰三角形或其他形式,先化为上述矩阵的样子方便解答,可用矩阵int [][]matrix={{7},{3,8},{8,1,0},{2,7,4,4},{4,5,2,6,5}}表示。//***原创 2016-05-20 10:20:34 · 998 阅读 · 0 评论 -
动态规划——斐波那契数列
//递归 public int fib2(int n) { if(n==0||n==1) return 1; return fib2(n-1)+fib2(n-2); }//自顶向下记忆化方式 private int data[]=new int [100];//不能确定index时,使用容器会发生下标越界; //所以自顶向下记忆化方式适用于本身n大小已知原创 2016-05-19 09:47:24 · 636 阅读 · 0 评论 -
二分查找——Search in Rotated Sorted Array
题目:在旋转数组中寻找数组,旋转数组在旋转前为不降序排序数组,可能有重复数字。若没找到,返回-1。public boolean search(int[] data,int target) { if(data == null||data.length == 0) return false; int left=0; int right=data.length-1;原创 2016-07-22 10:19:35 · 461 阅读 · 0 评论 -
排序——堆排序
优先队列可以用于0(N*logN)时间的排序。若使数组按从小到大顺序排序,则需构建最大堆Max。堆排序步骤:1.若使数组按从小到大顺序排序,则需构建最大堆Max;2.使用需要排序的数组以线性时间建立一个堆;3.然后通过每次将堆中的最后元素与第一个元素交换,执行N-1次deleteMax操作,每次将堆的大小缩减1并进行下滤。//swap函数;public void swap(int[] data,......原创 2016-05-16 15:24:30 · 474 阅读 · 0 评论 -
排序——quickSort
JAVA中Arrays类对基本类型的sort方法中使用优化的快速排序算法。对于很小的数组(N<=20)快速排序不如插入排序。平均时间性能为O(n*logN),最差性能为O(n*2),可经过三数取中等方法,使该情况极难出现。快速排序为不稳定排序的原因:比如序列5 3 3 4 3 8 9 10 11,现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一...原创 2016-05-16 11:31:04 · 392 阅读 · 0 评论 -
二分查找——Median of two Sorted Arrays
本题为在两个排序数组中找第K大的数的一个特殊情况——第(A.length+B.length)/2大的数。使用并归的思想逐个比较找出满足要求的数的时间复杂度为O(N)。使用二分法比较A[K/2-1]和B[K/2-1],并思考这两个元素和第k大元素的关系。1.A[K/2-1] 2.若k/2-1超出了A的长度,则必取B[0]~B[k/2-1]。接下来考虑特殊情原创 2016-07-22 11:36:29 · 319 阅读 · 0 评论 -
动态规划——triangle空间复杂度O(n)
仍是数字三角形问题,求从三角形顶端到最底层最小路径和。题目要求空间复杂度O(n),那么就要将二维数组压缩为一维。因DP中历史状态只能通过当前状态影响下一个状态,所以压缩数组是可行的。数字三角形如下:[ [2], [3,4], [6,5,7], [4,1,8,3]]import java.util.*;public class Solut原创 2016-05-21 18:55:36 · 2051 阅读 · 1 评论 -
动态规划——矩阵连乘问题
问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。例:设要计算矩阵连乘乘积A1A2A3A4A5A6,其中各矩阵的维数分别是: A1:30*35; A2:35原创 2016-05-20 11:50:03 · 1510 阅读 · 0 评论