
算法
文章平均质量分 73
王子力
星星之火,可以燎原
展开
-
图论算法-求N阶自互补简单图
出处:http://www.fengchang.cc/post/151题干如下:第一小题我就不说了,主要说第二和第三小题。解释一下题意,意思是说,一个简单图(两点之间最多只有一条边连接,且没有自己到自己的连接(环)),如果对该图做一个变换:任意一对顶点,原来图中两个顶点有连接边的,变成没有,原来图中两个顶点没有连接边的,变成有,则类似下面左图,变换后,就变成右图,这样变...原创 2019-09-08 20:19:51 · 6941 阅读 · 0 评论 -
层次遍历二叉树
老生常谈了,笔试又碰到,索性总结一下:思路很简单,根入队,然后出队并访问,然后入队左子节点(如果不空的话),再入队右子节点(如果不空的话),循环往下,直到队列为空。import java.util.LinkedList;class TreeNode{ int val; TreeNode left; TreeNode right; public TreeN原创 2017-07-19 12:25:45 · 300 阅读 · 0 评论 -
分截排序之二分查找
假如有一个排好序的整型数组,例如「1,2,3,4,5,6,7,8,9」, 从某处截断,后面一段整体移动到左边一段的左边,例如变成「5,6,7,8,9,1,2,3,4」,这样处理后的数组成为分截排序数组,给定一个分截排序数组,如何做二分搜索?这道题理论上不难,曾经去携程面试的时候问到过,当时没怎么刷算法,答得有点慢,现在手头有几个offer了,索性总结一下:思路如下,第一步还是找到中原创 2017-07-18 15:19:46 · 273 阅读 · 0 评论 -
leetcode hard模式专杀之233. Number of Digit One
这道题思路很快就有了,但提交了七八次才通过,总结下来,是自己对数字计算可能还是不够敏感,导致边界条件总是考虑不周,不过总算独立完成了,足够犒赏自己一笔钱了,嘿嘿。思路如下:比如有一个数123, 可以这样计算,设定个位数为1,满足条件的其他位数上的组合有n0个,再假设十位数上的数字是1,满足条件的其他位数上的组合有n1个,再假设百位上的数字位1,满足条件的其他位数上的组合为n3,则最终的结果为n1+原创 2017-07-18 11:28:49 · 279 阅读 · 0 评论 -
leetcode hard模式专杀之72. Edit Distance
这题是比较标准的动态规划吧,动态规划里不算难,关键找出递归表达式,上代码:public class Solution { public int minDistance(String word1, String word2) { // Start typing your C/C++ solution below // DO NOT write in原创 2017-06-13 20:17:06 · 230 阅读 · 0 评论 -
leetcode hard模式专杀之68. Text Justification
这道题又是属于思路不难,但是边界条件极难把握准确的,题目,是一道联系思考边界条件的难得好题,值得仔细琢磨。思路其实非常简单,遍历,计算该塞多少空格,拼字符串,加入list,说起来就这么简单,没有任何难想的地方,但是组织代码有一定的难度,估计这个就是这道题为hard模式的原因吧,不bb了,上代码:public class Solution { public List full原创 2017-06-11 22:25:00 · 264 阅读 · 0 评论 -
leetcode hard模式专杀之295. Find Median from Data Stream
这道题没有独立做出来,而且乍一看,怎么觉得这题这么容易,想当然地以为插入的数据就是排好序的,被sample误导了,于是就各种不通过,这题与其说是考算法,不如说是考数据结构,直觉地想法是维护一个排序地数据结构,这个数据结构需要有如下特点:1. 排序2.插入效率高(因为插入频率高)3.读取效率高(因为要取中位数)所以,arraylist不行,linkedlist不行,那怎么破?原创 2017-07-13 18:38:54 · 245 阅读 · 0 评论 -
动态规划之longest common subsequence最大公共子序列
这题相对于longest common substring而言,区别就子序列和子串, 串的话每个字母是要连续的,序列的话,不要求,用动态规划做,上代码:public class CommonSubseq { public static void main(String[] args){ String strA = "BDCABA"; String strB = "ABCBDA原创 2017-07-13 17:18:49 · 1017 阅读 · 0 评论 -
接前-递归遍历二叉树
太简单,略原创 2017-06-11 20:06:37 · 231 阅读 · 0 评论 -
接前-后序遍历二叉树(非递归)
上代码:class Node { int data; Node left, right; Node(int item) { data = item; left = right = null; }}class BinaryTree { Node root; public List iterativePos原创 2017-06-11 19:35:09 · 208 阅读 · 0 评论 -
二叉树层级遍历之每层最后一个值
原题是说站在二叉树的右侧,从根到叶能看到的节点,也就是说同层右边的节点能挡住同层左边的节点。这个问题,基于层级遍历二叉树的基础来做即可,用代理模式新建一个类别包装TreeNode节点,添加属性level,根为0,孩子节点level+1, 然后判断是不是该层最后一个节点,可能没有办法,只能通过下一个节点层级是否与前一次不同,这样每次遍历实际上要记录前一次的level和value,代码如下:原创 2017-07-19 14:42:04 · 1482 阅读 · 0 评论 -
leetcode hard模式专杀之135. Candy
这题大概思路出来大概十来分钟,不过做到通过oj却花了几个小时,主要是一些情况没有考虑完整,首先在纸上画一划,看看如果人去做这件事,会怎么做,画了几遍之后,可以得出一个大概都结论,例如ratings序列是[1,2,3,7,5,6,9,2,1],首先第一个位置的孩子得到1个糖果,rating值等于5的孩子得到1个糖果, 然后最后一个孩子得到一个糖果,然后其他位置的孩子,从这几个位置推导出来即可,那么两原创 2017-08-06 15:31:34 · 252 阅读 · 0 评论 -
leetcode hard模式专杀之420. Strong Password Checker
题干:A password is considered strong if below conditions are all met:It has at least 6 characters and at most 20 characters. It must contain at least one lowercase letter, at least one uppercase le...原创 2018-11-29 17:59:40 · 399 阅读 · 0 评论 -
算法之求最大下标距离
出处:http://www.fengchang.cc/post/66题干:输入:任意整型数组A求满足约束条件A[i]<A[j] 且i<j的最大j-i数学上是个最优化问题,暴力求法就不说了,n平方时间复杂度的大家都会。这里给思路上的9个直觉,直觉是让你记住算法的终极武器,比代码重要,掌握了直觉,才算是真正理解。源代码用python写的,放这里了https://gith...转载 2018-08-28 14:55:07 · 276 阅读 · 0 评论 -
xgboost学习样例解析之binary classification
玩kaggle时听说这个库很牛逼,准确率很高,于是打算学学看看。xgboost是extreme gradient boosting的缩写,gradient boosting是一类思想方法,这里不多赘述,可以参考这里:gradient boosting简介本文主要解析实例,理论以后慢慢补上。binary classification的例子官方原文在此: 点击打开链接原创 2017-09-19 16:46:38 · 1623 阅读 · 0 评论 -
xgboost学习样例之multiclass_classification
上篇用到xgboost cli来做二分类,现在来做一个多分类。使用的数据集为 UCI皮肤病集总共有34个属性集合,6种分类label, 属性集除了family history是名词式的取值外,其他都是线性数值行取值7. Attribute Information: -- Complete attribute documentation: Clini原创 2017-09-19 18:06:34 · 3621 阅读 · 0 评论 -
薛定谔的猫
这个概念听了也有一段时间了,最近又仔细琢磨了一下,这里写个总结。首先这是一个思想实验,也就是完全在思想中构建的一个逻辑推演过程,不是现实中谁做过这个实验,或者他娘的什么类似的实验。所以不要问为什么这样那样,想不通啊什么的,我们要理解的是逻辑推演过程以及整个来龙去脉。百度百科的描述如下:是把微观领域的量子行为扩展到宏观世界的推演。这里必须要认识量子行为的一个现象:观测。微观物原创 2017-09-10 21:04:14 · 1464 阅读 · 0 评论 -
P, NP, NP-complete, NP hard问题
http://www.fengchang.cc/post/52原创 2017-09-10 20:34:42 · 369 阅读 · 0 评论 -
leetcode hard专杀之84. Largest Rectangle in Histogram
上篇博客说了,这题是基础,所以这里还是把这题的思路说一下,这题难度蛮高的,动态规划不好做,brute force性能又不够,着实令人头疼,后来还是看了下网上的思路,而且代码实现出来还不是那么符合直觉。总之思路是这样的,从0~n遍历,对每个i,都以它为中心,分别向左和向右数,任意一个方向,都期望单调其递增,直到左边出现第一个index递减,极为left,同样右边出现第一个递减的位置rig原创 2017-09-18 13:08:24 · 450 阅读 · 0 评论 -
adaboost原理和example
这篇讲得比较好理解: http://blog.youkuaiyun.com/v_july_v/article/details/40718799然后github上有一个可读性比较好的案例: https://github.com/fengchangfight/NaiveBayesSpamFilter原创 2017-09-25 17:11:06 · 356 阅读 · 0 评论 -
接前-中序遍历二叉树(非递归)
import java.util.Stack;class Node { int data; Node left, right; Node(int item) { data = item; left = right = null; }}class BinaryTree { Node root; public vo原创 2017-06-11 12:30:18 · 218 阅读 · 0 评论 -
前序遍历二叉树(非递归)
前一篇做了leetcode一道二叉树的hard模式,感觉自己对二叉树的一些数据结构不太敏感,于是打算做个总结,把二叉树的常见遍历方式记录一下,从本篇开始,将按如下顺序实现:1.前序遍历二叉树(非递归)2.中序遍历二叉树(非递归)3.后续遍历二叉树(非递归)4.前序遍历二叉树(递归)5.中序遍历二叉树(递归)6.后续遍历二叉树(递归)本篇为1.前序遍历二叉树,上代原创 2017-06-11 11:50:01 · 1634 阅读 · 1 评论 -
leetcode hard模式专杀之57. Insert Interval
这题思路 不算难,但同样是要注意边界条件, high level的思路是如果新插入的interval没有任何overlap,那就直接插入,否则,就通过如下方式合并:删掉所有的有overlap的interval,再插入一个新的interval那么问题来了,如何确定哪些是overlap的interval, 新的interval又是从哪儿到哪儿?要回答这两个问题,通过两次循环遍历足矣,上代码:原创 2017-06-08 14:11:26 · 339 阅读 · 0 评论 -
leetcode hard模式专杀之32. Longest Valid Parentheses
继续leetcode hard模式,这题整了我好久,想了好几种方法,最终都没能通过oj都时间复杂度,然后忍不住看了答案,简洁到尿,想死, 上代码:import java.util.Stack;public class Solution { public int longestValidParentheses(String str) { int n = str.原创 2017-06-06 16:09:05 · 237 阅读 · 0 评论 -
leetcode hard模式专杀之42. Trapping Rain Water
继续刷leetcode hard模式, 这题是我喜欢的类型,可能因为我空间想象力还行,这题在2次内通过oj,思路如下: 可以这样想, 每个数字上方拖着的空间如果左边有墙,右边也有墙,那么这个水就流不出去,而墙可以用左边最高的数字和右边最高的数字来表示,例如位置i,左边最高墙是3,右边最高墙是4, 那么i上能托几格水呢?当然是min(3,4)-i啦,所以这个问题就转换为如何高效率地找出每个位置i原创 2017-06-06 17:06:22 · 330 阅读 · 0 评论 -
leetcode hard模式专杀之37. Sudoku Solver
继续刷题leetcode之数独这题乍一看挺吓人的 ,不过正好前几个礼拜做过八皇后问题,对回溯法有一定的记忆和认知,然后还有的技巧是位运算,hashmap记录等等,尽可能地节省空间复杂度。思路如下,先遍历一遍二维数组,本次遍历是为了收集统计数据,哪些统计数据呢?有三个,第一,每一行还差哪些数字没填, 第二,每一列还有哪些数字没填,第三,每个block还有哪些数字没填,为了节省空间,那些数字没填就原创 2017-06-07 17:53:45 · 324 阅读 · 0 评论 -
leetcode hard模式专杀之51. N-Queens
继续leetcode hard模式, 八皇后问题的一般版,这种举一反三的题目值得好好琢磨,典型的回溯法,思路就不多说了,上代码,注意一一些边界条件的细节:public class Solution { public List transfer(int[] q){ List result = new ArrayList<>(); for(int原创 2017-06-07 20:19:08 · 319 阅读 · 0 评论 -
leetcode largest number
视频分析: http://v.youku.com/v_show/id_XMTMyOTM3NDcwMA==.html题干: Given a list of non negative integers, arrange them such that they form the largest number.思路分析: 这题论证方法严格来讲比较困难,不求甚解的话光写出代码来倒是不难。For exam原创 2015-09-07 14:33:47 · 470 阅读 · 0 评论 -
leetcode add digits
视频分析: http://v.youku.com/v_show/id_XMTMzMjUwNjk3Mg==.html 题干: Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.For example:Given num = 38, the proc原创 2015-09-12 13:33:14 · 1084 阅读 · 0 评论 -
leetcode hIndex implemented with python
视频分析: http://v.youku.com/v_show/id_XMTMyOTc5NjMwNA==.html 题干: Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher’s h-in原创 2015-09-12 13:21:05 · 780 阅读 · 0 评论 -
leetcode-happy number implemented in python
class Solution(object): def isHappy(self, n): if n==1: return True elif n==4: return False else: return self.isHappy(self.Happy(n)) de原创 2015-08-22 12:52:36 · 1254 阅读 · 0 评论 -
leetcode hard模式专杀之52 N-Queens II
这道题我不清楚跟N-Queens的区别是什么,核心算法都是一样的,只是这道题是计数,前一道是计算具体的组合,组合都出来了,计数还会难吗?不bb,上代码:public class Solution { public int totalNQueens(int n) { Map result = new HashMap<>(); int[] q=new原创 2017-06-07 22:04:25 · 299 阅读 · 0 评论 -
leetcode hard模式专杀之41 First Missing Positive
这题看下来第一灵感就是用位运算,因为要用 O(n) time and uses constant space.,于是很快地写了一版,果不其然,用位运算一定要考虑溢出的问题啊,第一版草草这么写果然就溢出了,因为把1 左移整数位,java这边移动个32位基本就到顶了,就算用long,移个64位差不多也到顶了,于是想到一个解决方案即使用多个整数,一个整数就算能表示k个位置,两个整数不就可以表示2k个原创 2017-06-06 23:16:40 · 262 阅读 · 0 评论 -
leetcode hard模式专杀之76 Minimum Window Substring
继续刷leetcode hard模式 https://leetcode.com/problems/minimum-window-substring/#/description这题感觉算是hard模式中比较容易的 一题, 不过算法非常典型, 是一个举一反三的好例子, 很多看起来很难的题目都可以通过这题找到原始思路。按说找一个字符串窗口不是难事,但是要保持O(n)的时间复杂度,原创 2017-06-05 13:10:48 · 334 阅读 · 0 评论 -
leetcode hard模式专杀之99. Recover Binary Search Tree
这题的思路我还是很快想出来了,奈何二叉树的数据结构和遍历模式不太敏感,代码迟迟没写出来,看来二叉树类的题目需要专项训练一下,补补,下一篇博客我会把二叉树的几种常见算法总结一下。说思路吧,其实关键就是找到两个交换过的位置就行了,接下来做个交换就行,BST本身如果把它平展开来,就是一个排序序列,例如1,2,3,4,5,6,7,那么这样一个序列假如随机交换两个数会发生什么呢?例如变成1,5,原创 2017-06-11 11:24:28 · 261 阅读 · 0 评论 -
leetcode hard模式专杀之45. Jump Game II
这道题跟其父题Jump Game都属于实现出来不难,但是通过OJ不容易的题目,反正我是这样感觉的,因为第一版我很快都写出来了,但是通过OJ却弄了七八次,蛋疼无比,不过总算是没有看答案,坚持自己写出来了,能仔细琢磨总结其经验,也不枉花了这么多时间。原本以为用其父题目稍微改改代码就能完成,后来发现不是这样,时间复杂度完全通不过,于是苦苦琢磨其他方式。最后思路大概是这样的,从第一个开始通过i+nums[原创 2017-06-10 21:47:40 · 244 阅读 · 0 评论 -
leetcode矩阵类题目专杀之54. Spiral Matrix
http://www.fengchang.cc/post/3原创 2017-07-02 08:15:33 · 221 阅读 · 0 评论 -
leetcode动态规划专杀之53. Maximum Subarray
这一题是easy模式,但是我甚至觉得比某些hard模式都难,总之想法不是很直观,我没有很快做出来,却是能用动态规划来解决的,这种类型真的要多练练。没太多好解释的,上代码,只要对着代码和一个例子,一步步推敲一遍,相信很容易看懂public class Solution { public int maxSubArray(int[] nums) { if(nums==null原创 2017-07-01 21:16:21 · 252 阅读 · 0 评论 -
动态规划之 longest common substring最大公共子串
这题是经典的动态规划算法,有些帖子没说清楚,然后看了下wikipedia,基本上一张图能看懂递推关系,基于这张图的算法,自己写了一版:import java.util.Arrays;public class CommonSubstring { public static String commonSub(String st1, String st2){ i原创 2017-07-11 15:41:53 · 563 阅读 · 0 评论 -
leetcode hard模式专杀之55. Jump Game
这道题其实是medium模式,不过因为他是Jump Game II的前提,所以也一并做了,思路倒是不负责,动态规划来做就好,不过这题让我提交了七八次才通过oj,前几次是超时,后几次修改是有些条件没考虑,所以是很值得仔细琢磨的一道题,思路是这样的,从0开始,想象可以往后染色,然后在染色范围内,继续往后染色,如果某次染色的最大index大于等于最后的index即length-1,则返回true,如果一原创 2017-06-09 11:54:41 · 253 阅读 · 0 评论