算法
文章平均质量分 61
codekiller_
普天之下,谁不辛苦
展开
-
LeetCode中338Counting Bits的题解
题目来源是LeetCode中的338题,题干意思很简单,就是给出一个非零整数,要求计算该整数范围内的每一个数所对应的二进制位中“1”的数量,并将其存储在一个数组中,返回数组。题目在LeetCode中属于中等难度题,因为特地要求了时间复杂度和空间复杂度均为O(n),按照常规做法很容易得到所需要的输出结果,但是时空间复杂度达不到要求。这也是该题的关键所在,把这道题的解题思路整理如下。一、原题描原创 2017-02-26 19:40:37 · 249 阅读 · 0 评论 -
【LeetCode515 Find Largest Value in Each Tree Row】二叉树每行的最大值
一、问题描述给定一个二叉树,二叉树每一行都有一个最大值,将该值保存到一个数组中,最后输出该数组。举例如下:给定二叉树,输出数组[1,3,9]Input: 1 / \ 3 2 / \ \ 5 3 9 Output: [1, 3, 9]二、思路详解这一题是遍历树,给树的每原创 2017-06-23 17:04:18 · 786 阅读 · 0 评论 -
[LeetCode198 House Robber]数组中的动态规划求最值问题
一、题目解析给定一个数组,数组中的每一位相当于一座房子,数组值代表偷窃该房子所能得到的财富值。现在一个小偷要对这么多房子进行偷窃,规定偷窃连续的两个房子将会触发报警系统,算法需要输出小偷在这条街上偷窃所能得到的最大财富值。二、思路解析用动态规划的思路解决这个问题非常清晰,首先确定该问题的子问题。以n代表这条街上的房子数,由于无法偷窃相邻的两个房子,所以子问题即为money(n-2)+m原创 2017-06-23 16:58:29 · 459 阅读 · 0 评论 -
【LeetCode 300 Longest Increasing Subsequence】最长递增子序列
一、题目描述给定一个乱序整数序列,要求算法在这个乱序序列中找到最长递增子序列,并且返回长度。例如,给定序列[10,9,2,5,3,7,101,18],最长的递增子序列为[2,3,7,101],因此返回长度为4,最长递增子序列可以有多个,只是其拥有一个固定的最大长度值。算法要求在O(n^2)的时间复杂度中完成,也可以尽可能的优化到O(n log n)的时间复杂度。二、思路分析根据分治算法原创 2017-06-23 16:13:22 · 311 阅读 · 0 评论 -
【LeetCode 4. Median of Two Sorted Arrays】两个有序数组的中位数求解
一、题目描述给定两个已经排好序的数组nums1和nums2,长度分别是m和n,要求求出这两个有序数组合并后的新数组中的中位数,并要求整个程序实现的时间复杂度为O(log(m+n))。例如数组1 nums1=[1,3],给定的数组2为 nums2=[2],则输出数组[1,2,3]的中位数2.0,若是[1,2]和[3,4],则输出中位数2.5。二、思路解析这道题的难点在于控制时间复杂度,由原创 2017-06-11 14:54:52 · 423 阅读 · 0 评论 -
【LeetCode64 Minimum Path Sum】动态规划计算路径
一、问题描述给定一个m*n的方格,其中每一个方格中都有一个数字,现在从方格最左上方移动到最右下方,每次移动只能是想下移动或者向右移动。对于每一条路径都对应一个路径和的概念,即为该路径中所有方格中数字的和,需要求出最左上方到最右下方的所有路径中,路径和最小的那个,并且输出该路径和。二、思路解析这道题思路较为简单,同样的利用动态规划思路去解决问题,计算出从起点到m*n矩阵中每一个方格的最短原创 2017-06-10 21:38:20 · 405 阅读 · 0 评论 -
【LeetCode62 Unique Paths】动态规划计算路径
一、问题描述给定一个m*n的方格,起始点为方格的最左上方,终点为方格的最右下方,一个机器人只能向下以及向右移动,需要求出机器人从起始点到终点一共有多少种不重复的路径。问题的输入为方格的长度m以及宽度n,输出为不同路径的数量。二、思路分析这道题用动态规划的方法非常简单,计算出机器人从起点开始到方格内每一个格子的不同路径数,并将路径数量保存到一个相同大小的m*n的矩阵中M,那么我们只需要输原创 2017-06-10 21:20:28 · 755 阅读 · 0 评论 -
【LeetCode2 Add Two Numbers】链表求和详解
一、问题描述给定两个非空链表,其中链表中的每一个节点都是一个十以内的数字,链表的倒序数字串代表相应的十进制数值,因此每一个链表都会对应一个数值。题目中给定两个链表,需要求出其数值和,并将该数值和也相同的形式用链表表达,返回聊表的头结点。例如,给定聊表2->4->3和5->6->4,其代表的数值分别为342和465,数值和为907,将807用链表倒序表示为7->0->8,因此输出7->0->8链原创 2017-06-10 20:51:28 · 2527 阅读 · 0 评论 -
【算法证明】NP完全性问题证明
一、问题描述证明如下问题是NP-完全的:给定一个无向图G=(V,E)和整数k,求G中一个规模为k的团以及一个规模为k的独立集,假定他们都是存在的。二、问题证明可以将最大团问题归约到此问题。假设要求任意图G(V, E)中大小为k 的团,可以在图G 中添加k 个相互独立的顶点,得到新图G'。这新加的k 个顶点保证了图G'存在大小为k 的独立集,同时又不影响到原图的团。(1)可以原创 2017-07-01 16:08:14 · 4304 阅读 · 0 评论 -
【leetCode523】Continuous Subarry Sum
一、题目解析 这道题属于middle类型的题,题干为给一个非负的整数型数列,和一个整数k,若在该数列的子序列中,存在一个长度大于2且子序列和为k的整数倍的子序列,则返回true,否则返回false。例如,给序列[23,2,4,6,7]以及整数k=6,则返回true,因为子序列[2,4]是一个连续子序列且其和为6,能被k整除。二、思路分析这题本人思路较为简单,但是算法执行的速度非常慢。总提原创 2017-04-26 15:33:48 · 586 阅读 · 0 评论 -
【Leetcode508】Most Frequent Subtree Sum题解
一、题目描述给定一个二叉树的根节点,定义二叉树中的子树和为该子树中所有节点值的和。二叉树中每一个节点都可以为子树根节点,所得子树和也包括该节点,输出所给二叉树中出现频率最高的子树和值,若存在连个或者多个值出现频率相同且最高,则将其以任意顺序输出。二、思路解析二叉树中每一个节点都对应一棵子树,因此每一个节点也对应一个子树和的值。这题可分为两个过程解决,第一步是求出所给二叉树中每一个节点所原创 2017-05-07 19:18:18 · 313 阅读 · 0 评论 -
[LeetCode63]Unique pathII动态规划解题示例
一、题目描述给定一个网格,网格中的每一个方格分别用0和1表示,其中0表示该方格可以通过,1表示该方格有障碍物,无法通过。因此该网格可以用一个n*m的矩阵M表示,其中矩阵元素只包括1和0,求M[0][0]到M[n-1][m-1]有多少种不同的路径可以到达,每次移动只能向下或者向右移动。比如给定方格为以下方格矩阵,[ [0,0,0], [0,1,0], [0,0,0]]则输出原创 2017-05-07 18:24:37 · 403 阅读 · 0 评论 -
【70 Climbing Stairs】菲波那切数列解决思路
一、原题描述一个n级台阶,每次只能登一级台阶或者两级台阶,输出攀登到台阶顶端一共有多少种不同的方法。You are climbing a stair case. It takes n steps to reach to the top.Each time you can either climb 1 or 2 steps. In how many distinct ways原创 2017-04-17 15:05:47 · 403 阅读 · 0 评论 -
【543 Diameter of Binary Tree】深度优先搜素思维运用
一、题目解析这道题题意就是一个二叉树找出路径长度最大的两个点,并将这两个点的路径长度输出为结果。需要注意的就是路径不一定非得经过根节点,这也是容易犯错的地方,也是这道题的难点所在。二、思路分析这道题首先很容易想到从根节点开始,分别计算左右子节点的深度然后相加即为结果,这种思路是最容易误入的。因为最长路径很可能是不经过根节点的。那么从深度优先搜索DFS的思想出发,从某一节点开始,计算路过原创 2017-03-26 20:24:39 · 480 阅读 · 0 评论 -
【Leetcode513 Find Bottom left Tree Value】树的遍历
一、题目解析本题题意清晰,已知一个二叉树,找出这颗二叉树中最左下方的那个节点,并返回节点值。意思即找出二叉树中最高层中左侧开始的第一个叶子节点,因此在代码解析中只要找出满足两个条件的点就可以。第一个是处于最高层叶子节点处,第二是本层所在的第一个叶节点,后面的代码实现也是围绕着这两条件对节点进行选择。例如:Input: 1 / \ 2 3原创 2017-03-31 14:12:22 · 367 阅读 · 0 评论 -
【leetcode4】用分治算法计算中位数问题
此题在leetcode中评级为hard,目的是在O(log(m+n))的时间复杂度情况下解决问题。用常规O(m+n)的算法很容易求得结果,但显然不符合时间复杂度的要求。因此,这道题的解题分析主要还是利用分治算法去考虑,这也是本题的难点所在。一、原题叙述There are two sorted arrays nums1 and nums2 of size m and n respec原创 2017-03-11 15:48:15 · 8253 阅读 · 2 评论 -
【LeetCode24】Swap Nodes in Pairs题解
一、题目详解由于原题大家都在原网站上能看到,这里就不把题目原样复制粘贴下来了。主要意思就是给定一个链表,将其链表内节点两两交换,最后返回交换后链表的头部。二、思路详解这道题可以用递归的方法将诶绝而且时间复杂度相对较小,我用的是循环读取链表节点,然后两两交换节点。实现起来比较麻烦的地方就是节点之间交换操作,注意交换节点后指针重新指向新节点就行,其余并没有多少难度。三、代码实现原创 2017-03-19 16:47:53 · 293 阅读 · 0 评论 -
[538 Convert BST to Greater Tree]搜索二叉树的数值计算
一、题目解析给定一个搜索二叉树,然后将该搜索树的每一个节点Node[i]进行转换,其中具体转换规则为每一个节点的新值等于该二叉搜索树中所有比他大的节点值与其本身值的和,依次将该二叉树的每一个节点值按照以上规则进行重新计算,输出新二叉树的根节点,详情举例如下:Input: The root of a Binary Search Tree like this:原创 2017-06-23 17:44:07 · 358 阅读 · 0 评论