leetcode
_冬木
这个作者很懒,什么都没留下…
展开
-
字符串匹配算法
有限状态机一个有限状态机包含3部分:有限的状态集合,其中包含初始状态、中间状态和接受状态(或者叫做终止状态)有限的输入字母表状态转移函数一个简单的两状态自动机如下:状态集合为{0,1} 其中0是初始状态,也是中间状态,1是接受状态输入表为{a,b}状态转移函数表示为状态转移表如下:状态输入a输入b010100等价的状态转移图为:此...原创 2020-03-28 11:54:32 · 209 阅读 · 0 评论 -
系列:1到1000中包含8的个数
排列组合问题分析: 不包含8的数的每一位都不是8,1到999是三位数,每位都不是8,只能由0到7和9构成,所以不包含8的数字的个数为9^3个。那么包含8的数字的个数为1000-9^3 = 271 编程验证: int x = 0; for (int i = 1; i <= 1000; i++) { if (String.valueOf(i).contains("8")原创 2017-05-07 22:10:30 · 9494 阅读 · 1 评论 -
leetcode 62-所有可行的路径数
放在高中来做,是一道简单的排列组合的问题。 横着需要走n-1步,竖着需要走m-1步。一共需要走m+n-2步,结果就是或者。 就是m+n-2步中找出m-1来竖着走,剩下的横着走。 这里涉及到计算阶乘,12的阶乘约4亿多,13的阶乘约62亿多,题目m和n最大是100,所以这里计算阶乘需要使用大数类。代码:public int uniquePaths(int m, int n) {原创 2017-05-07 18:48:29 · 584 阅读 · 0 评论 -
leetcode-51/52-N皇后问题
使用回溯法的经典例子。 使用数组a存储皇后所在的位置,第0个皇后在的位置放在a[0],比如a[0]等于0,表示第0个皇后在第0行的第0列;a[1]=2,表示第1个皇后在第1行的第2列。数组的下标表示第几个皇后在第几行,数组值表示在第几列。首先要写一个用于判断皇后是否冲突的函数,这表示当往数组中写入一个皇后的位置时,要判断这个皇后是否和之前已经放好的皇后是否冲突,即要写入的值不等于之前任何一个数组的原创 2017-06-08 23:08:35 · 274 阅读 · 0 评论 -
leetcode 3-最长无重复字符的子字符串
子字符串 substring 是连续的 处理数组、字符串的问题,通常滑动窗口都是一个值得去考虑的方案。 Given “abcabcbb”, the answer is “abc”, which the length is 3.以这个为例,用一个map存放字符和索引值,然后就可以用O(1)的时间去判断一个字符是否出现过,如果没有出现过,最大长度加1。如果出现了,并且如果这个字符出现在当前窗口的起始原创 2017-07-11 13:39:20 · 764 阅读 · 0 评论 -
leetcode 5-最长回文子字符串
题目: 给定一字符串,找出里面的最长的回文子字符串,结果不唯一。首先暴力法不说了,时间复杂度为O(n^3),因为遍历每个子字符串需要两层循环,在内层循环中判断是否为回文串又是一层循环。1 . 动态规划时间复杂度是O(n^2)思路:由小的子串逐渐扩展为大的子串,实际上和中心扩展法一样,只不过这里使用了table来保存每个子串是否为回文串。但是和中心扩展法不同的是,DP思想会判断所有的子串,而中心扩展是原创 2017-05-07 14:58:57 · 348 阅读 · 0 评论 -
leetcode-28-匹配字符串位置(KMP)
首先是暴力算法,竟然也能AC,看来示例都不怎么长啊。public int strStr(String haystack, String needle) { for (int i = 0; i <= haystack.length() - needle.length(); i++) { int j; for (j = 0; j < nee原创 2017-05-14 21:07:21 · 268 阅读 · 0 评论 -
leetcode-8-字符串转数字atoi
需要尽可能考虑所有的情况,不符合的情况返回0 首先字符串有可能存在前导空白,需要去掉,然后第一个字符只能为正号负号或者数字,考虑Integer的parseInt方法,如果第一个字符时正号,需要去掉。然后从第二个字符开始,一直到字符不为数字或者结束为止,使用parseInt有可能发生溢出,溢出是异常,通过判断第一个字符是否为负号来决定是返回int所能表示的最大值还是最小值。 首先去掉前导空白,使用原创 2017-07-17 21:27:27 · 1037 阅读 · 0 评论 -
leetcode-50-pow
实现pow(double x, int n): double最直接的方法:挨个乘起来。时间复杂度O(n)。该种做法耗时且浪费了可重复利用的资源。根据二分查找的思想,将累乘对半、对半、再对半划分,只需算一半便可得出结果,如下图所示。 上图是pow(x,10)的例子,x^10=((x^2)^2*x)^2 而对半的思路时间复杂度是O(log n)。所以可以采用递归实现,要注意的点: - 指数原创 2017-09-04 14:16:53 · 91 阅读 · 0 评论 -
leetcode-41-找出第一个缺失的正整数
题目要求时间复杂度为O(n)且使用常数空间,这意味着需要在原地进行排序。 数组索引0的位置存储1, 1的位置存储2,以此类推。 第一遍遍历数组,判断每个元素是否在其正确的索引位置上。如果这个元素不等于索引值加1,且大于等于1,且它可以存放到数组中,且它存放正确位置的数字和它不等,此时交换。否则,继续遍历下一个。 第二遍遍历数组,找出和索引值加1不等的,其索引值加一就是缺失的正整数。原创 2017-08-28 12:50:11 · 1418 阅读 · 0 评论 -
leetcode-204-质数的个数
判断n以内的所有的质数的个数,直接的想法是判断每个数是不是质数。 然而n以内的数是由质数和合数组成的,合数可以由质数生成,质数的倍数就是一个合数。 判断一个数是否为质数,就是判断2~根下n的每个整数是否可以被n整除,若都不能被整除,则为质数,否则为合数。换个角度,即2~根下n的每个整数的倍数都是合数,通过计算出所有的合数,剩下的就是质数。更精确地说,是仅仅计算2~根下n的每个质数的倍数,而合数的原创 2017-09-08 10:59:35 · 391 阅读 · 0 评论 -
空间换取时间
剑指offer 35 第一个只出现一次的字符 不需要额外空间的做法:从第一个字符开始,往后判断这个字符是否在后面出现过,如果没有,就是结果;最坏的情况是每个字符都做了判断,时间复杂度是O(n^2)。 以空间换取时间,就是借由HashMap来保存每个字符的出现次数。原创 2017-09-08 11:48:06 · 834 阅读 · 0 评论 -
leetcode-21-合并两个排好序的链表
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; ListNode head = new ListNode(Math.min(l1.val, l2.val)); i原创 2017-05-15 22:14:26 · 264 阅读 · 0 评论 -
leetcode 76
题意 :给定一个字符串S和T,找出S中包含T所有字符的最小子串。原创 2017-04-20 13:32:11 · 2961 阅读 · 1 评论 -
leetcode 36(后续继续更新)
考虑时间复杂度,牺牲空间换取时间,只需要遍历二维数组一遍,同时完成行、列和小九宫格的判断。使用Set结合,难点在于每个小九宫格坐标如何进行计算。九宫格坐标如下图所示分析坐标,可知行号每3个 i 就会对应加3,每3个j对应加1。列号是每3个i就会重复,每3个j就会重复。 所以 行号 计算 (i / 3) * 3 + j / 3 列号计算 (i % 3)* 3 + j % 3原创 2017-04-22 22:15:32 · 265 阅读 · 0 评论 -
leetcode 17-Letter Combinations of a Phone Number
1. 使用队列例如输入23,需要输出ad,ae,af,bd,be,bf,cd,ce,cf 首先根据第一个数字2,将它对应的字母加入队列,如下图所示根据第二个数字3,将它对应的字母依次和队列中现有的元素组合,并加入新的队列。取出a,将3对应的d、e、f依次和a组合,并加入队列,同理b和c做同样操作。如下图所示java代码如下 public List<String> letterCombination原创 2017-04-23 12:54:25 · 386 阅读 · 0 评论 -
leetcode 78-Subsets
使用回溯思想,以[1,2,3]为例,深搜 + 剪枝 进入第一层,[1],符合(剪枝的结果是符合),加入结果集;进入第二层,2,[1,2],符合(剪枝的结果是符合),加入结果集;进入第三层,3,[1,2,3],符合(剪枝的结果是符合),加入结果集;回溯到第二层,但没有进入第三层的路径了。 所以回溯到第一层,进入第二层,3,[1,3],符合(剪枝的结果是符合),加入结果集;同理也没有路径了。 所以原创 2017-04-23 14:47:54 · 183 阅读 · 0 评论 -
leetcode-10-正则表达式
abc .*abc 考虑这种情况,是匹配的。即带*号的可以理解是为备用情况,只有当不使用.*时后面无法匹配才使用.*,比如这种情况abc .*bc。原创 2017-05-14 16:42:34 · 406 阅读 · 0 评论 -
leetcode 30
leetcode 30题意:给定一个字符串s和一个字符串数组words,找出s中所有以words中全部元素拼接成的字符串作为子串的起始索引并返回。原创 2017-04-19 22:07:47 · 749 阅读 · 1 评论 -
leetcode 39-Combination Sum
和40题非常相似 自己写的代码 非常耗时间 (版本一)public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> list = new ArrayList<>(); List<Integer> temp = new ArrayList<>(原创 2017-04-23 19:03:36 · 176 阅读 · 0 评论 -
leetcode 40-Combination Sum II
public List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> list = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); Arrays.sort(cand原创 2017-04-24 12:20:54 · 92 阅读 · 0 评论 -
leetcode 110-判断一棵树是否为平衡二叉树
平衡二叉树的定义: 空树或者左右子树的高度差不超过1且左右子树也是平衡二叉树。需要用到计算深度的方法:public int depth(TreeNode root) { if (root == null) return 0; int left = depth(root.left); //计算左子树的深度 int right = depth(root.right); //计算原创 2017-05-06 12:23:46 · 1792 阅读 · 0 评论 -
leetcode 111-二叉树最小深度
最小深度定义为根节点到最近叶子节点的深度分析: 空树,最小深度为0 左右子树都为空,最小深度为1 左右子树不都为空,左右子树中有空树的情况,最小深度一定是在非空树中产生,因为最小深度定义为到最近叶子节点的深度。一旦左右子树有空的情况,这边的深度就可以置为正无穷,表示最小深度不可能再这里产生。然后分别计算左右子树的最小深度,使用递归策略。代码:public int minDepth(TreeNo原创 2017-05-06 12:57:49 · 2351 阅读 · 0 评论 -
leetcode-13-罗马数字转阿拉伯数字
M = 1000 D = 500 C = 100 L = 50 X = 10 V = 5 I = 1把数额较低的数字排在后面时,所表示的数字即其总和 把数额较低的数字排在前面时,所表示的数字为后者减去前者之值 数字顺序自左向右读。public int romanToInt(String s) { int res = getVal(s.charAt(0));原创 2017-05-15 20:01:11 · 292 阅读 · 0 评论 -
leetcode-14-求字符串数组最长公共前缀
String的compareTo方法是按照字典顺序比较的。而Arrays.sort方法对对象数组按照自然顺序进行排序。 public static void sort(Object[] a) 该方法要求数组元素实现了Comparable接口,所以如果是对字符串数组进行排序,是按照字典顺序进行排序的。public String longestCommonPrefix(String[] strs) {原创 2017-05-15 21:16:27 · 1619 阅读 · 0 评论 -
leetcode-20-合法的括号
public boolean isValid(String s) { if (s == null || s.length() == 0 || (s.length() & 1) == 1) return false; LinkedList<Character> list = new LinkedList<>(); char c = s.charAt(0)原创 2017-05-15 21:59:50 · 741 阅读 · 0 评论