![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LintCode
文章平均质量分 64
HxxxxxxxU
我就是我 不一样的花火
展开
-
LintCode 182:删除数字
描述给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。找到删除 k 个数字之后的最小正整数。N <= 240, k <= N样例给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542, k = 4返回一个字符串 "12"分析:用StringBuffer表示字符...原创 2018-07-29 16:28:10 · 710 阅读 · 0 评论 -
LintCode:最长上升子序列、最长公共子序列、最长公共子串
问题1:最长上升子序列最长上升子序列的定义:最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的分析:动态规划,dp[i]表示到nums[i]为止的最长上升子序列长度。dp[i]=max(dp[i],dp[j]+1),其中0<=j<i且nums[j]<nums[i]其中,dp[i]初始都设为1,因为自身也是一个上升子...原创 2018-06-14 11:09:20 · 269 阅读 · 0 评论 -
LintCode388:第k个排列
题目:给定 n 和 k,求123..n组成的排列中的第 k 个排列。分析:首先考虑能不能确定第k个排列是以哪个数字开头,以[1,2,3,4]的全排列为例,找第14个排列以1开头的排列总共有3!个,原因是第一个位置是1,剩下3个位置可以随便排列,有6个以2开头的排列总共有3!个,原因是第一个位置是2,剩下3个位置可以随便排列,有6个此时已经有12个排列所以剩下的两个排列即第14个排列一定在以3开头的...原创 2018-06-21 11:49:31 · 191 阅读 · 0 评论 -
LintCode:62. 搜索旋转排序数组 VS 63. 搜索旋转排序数组II
题目:分析:看到排序数组的查找问题,就要想到二分查找。旋转排序数组其实是由两个递增子数组组成,且前一个子数组中的任意元素都大于后一个数组中元素。left,right分别是指向数组首尾的两个指针。循环条件:left<=right若A[mid]==target,表示若A[mid]>A[left],表示left与mid均处于前一个递增数组中。 若target>=A...原创 2018-05-30 15:49:54 · 426 阅读 · 0 评论 -
LintCode: 78. 最长公共前缀(LCP)
题目:分析:直接两两进行比较,用res保存当前最长的公共前缀。public class Solution { /** * @param strs: A list of strings * @return: The longest common prefix */ public String longestCommonPrefix(String[] st...原创 2018-06-06 11:32:03 · 585 阅读 · 0 评论 -
LintCode:64. 合并排序数组
题目:合并两个排序的整数数组A和B变成一个新的数组。你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。分析:采用归并排序的方法,首先开辟一个额外空间,大小是两个数组之和,存放排序后的数组。也可以不使用额外空间,如果数组为一长一短且长的数组能容纳所有元素的话,可以从数组末尾开始遍历,进行归并排序。//额外的空间,从前往后遍历 public void mergeSor...原创 2018-06-13 09:59:58 · 400 阅读 · 0 评论 -
LintCode:433. 岛屿的个数
题目:给一个01矩阵,求不同的岛屿的个数。0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。分析:采用深度优先搜索的方法,对于位置(i,j)的数,若为1,则为岛屿,则对该位置进行深度优先遍历,使得其四周为1的置为0,并递归下去,类似于深度搜索。将该位置四周的为1的变为0的意思就是把它们看成与该位置为同一个岛屿,则再遍历的时候就不会计它们的数(如果原来为1,岛屿...原创 2018-06-12 20:03:55 · 663 阅读 · 0 评论 -
LintCode:91.最小调整代价(动态规划)
题目:分析:本题类似于一个背包问题,数组中的元素一个个调整,由于是求相邻元素的差值,所以只和前一个相邻元素的值有关,所以只需要记录上一个调整的值就可以。dp[i][j]表示调整到第i个数时,此时,第i个数取值为j,为代价和最小。显然dp[i-1][k]已知,则调整的总代价为dp[i][j]=dp[i-1][k]+abs(j-A[i])由于j和k有多种取值可能,所以循环求解判断,k表示前一个数,j表...原创 2018-05-29 10:03:12 · 1166 阅读 · 0 评论 -
LintCode:785. 最大权值和路径(动态规划)
思路:这是一道典型的动态规划题,思路类似于背包问题,dp中每个元素的值分别是来自于该位置上方和该位置右边的较大的一个值,新建dp矩阵,int[][] dp=new int[row+1][col+1]。注意是从右上角开始到左下角结束,状态转移方程为 dp[i][j]=max(dp[i][j+1]+nums[i-1][j],dp[i-1][j]+nums[i-1][j])(i从1开始,j从col-1递...原创 2018-05-24 10:33:58 · 1338 阅读 · 0 评论 -
LintCode:15. 全排列(不含重复元素)VS 16. 全排列(含重复元素)
题目:分析:采用深度优先搜索的递归方法,考虑一个个将元素放入排列中,递归求解,建立一个访问标志数组,记录已经访问过的数,递归终止的条件是排列的长度等于数组的长度时,递归结束。(需要记得回溯)public class Solution { /* * @param nums: A list of integers. * @return: A list of permutat...原创 2018-06-04 15:19:37 · 222 阅读 · 0 评论 -
LintCode:650. Find Leaves of Binary Tree
题目:分析:遍历二叉树,找到叶子结点后,将其加入到list中,然后置为null,这样可以一层层剥离开来。/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val)...原创 2018-06-04 10:20:39 · 280 阅读 · 0 评论 -
LintCode:511. 交换链表中的两个节点
分析:首先,因为头结点也有可能被交换,所以需要在头结点之前创建一个新结点,然后连接到现有的链表之前。新建指针pre1和pre2作为v1和v2的前结点,扫描链表,若pre1或者pre2为空,说明未找到v1或v2。如果pre1和pre2相邻,即pre1.next=pre2,则交换,使得pre1在前pre2在后。讨论两种情况,分别为pre1.next==pre2和pre1与pre2不相邻的情况。publ...原创 2018-05-23 10:57:09 · 403 阅读 · 0 评论 -
LintCode:30. 插入区间
题目:分析:在非重叠的区间中插入一个新的区间,可能还需要与原有的区间进行合并,因此要对给定的区间集合进行遍历,需要考虑两点:新插入的区间与原有区间不重叠,重叠的情况分为两种:第一种是新区间的start>原区间的end;第二种是新区间的end<原区间的start。这种情况直接将新区间插入到对应的位置即可。新插入的区间与原有区间重叠,可能存在多个重叠,所以需要更新区间的范围来包含所有重叠。...原创 2018-06-02 16:59:50 · 309 阅读 · 0 评论 -
LintCode: 883 Max Consecutive Ones
分析:本题题意是找到连续的1的个数,有1次将0翻转为1的机会。用一个通解来处理此类问题,k为可翻转的机会数目。此题k=1.可以维护一个[left,right]的移动窗口来容纳k个0,每当遇到0,就累加zero的个数,然后判断此时0的个数是否大于k,若大于k,则右移左边界left,如果移除掉的nums[left]为0,则zero--。然后用窗口中的数字个数来更新res。public class So...原创 2018-05-22 10:06:42 · 131 阅读 · 0 评论 -
LintCode: 902. Kth Smallest Element in a BST
题目:分析:因为二叉搜索树的中序遍历是递增的这一特性,可以先得到该二叉搜索树的中序遍历序列,然后直接返回第k个元素即可。/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(...原创 2018-05-08 15:55:19 · 154 阅读 · 0 评论 -
LintCode 104:Merge K Sorted Lists(合并K个排序链表)
题目:合并k个排序链表,并且返回合并后的排序链表。样例给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null分析:采用归并排序的思想。数组的数递归划分,一分二,二分四…直至最后一个数单独的成为一组,然后再进行归并划分采用的递归实现。即把K个链表一直对分直到最后一个链表为一组,然后进行递归两两归并,两两归并的操作即...原创 2018-06-22 13:17:57 · 193 阅读 · 0 评论 -
LintCode:44.最小子数组
题目:给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。分析:贪心算法,数组的每个元素都可以加或者不加,从第一个元素开始判断,包括第一个元素时和不包括第一个元素的情况取最小值。public int minSubArray(List<Integer> nums) { // write your code here int min=nums.get...原创 2018-06-23 13:50:51 · 314 阅读 · 0 评论 -
LintCode:118.不同的子序列(考点:动态规划)
描述给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。 样例给出S = "rabbbit", T = "rabbit"返回 3分析:采用动态规划的思想,dp[i][j]表示S前i个字符中含有T前j个字符的个数,不管S...原创 2018-07-14 13:35:33 · 280 阅读 · 0 评论 -
LintCode:402. 连续子数组求和
描述给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大。输出答案时,请分别返回第一个数字和最后一个数字的下标。(如果两个相同的答案,请返回其中任意一个)样例给定 [-3, 1, 3, -3, 4], 返回[1,4].分析:变量ans保存当前最大的连续子数组之和,sum表示当前start-end之间的和,遍历数组,如果sum<0,则重置start和end位置,其他情况...原创 2018-07-25 17:21:04 · 410 阅读 · 0 评论 -
LintCode:跳跃游戏 I VS跳跃游戏 II
描述给出一个非负整数数组,你最初定位在数组的第一个位置。 数组中的每个元素代表你在那个位置可以跳跃的最大长度。 判断你是否能到达数组的最后一个位置。分析:方法一:基于动态规划的做法,时间复杂度O(n^2)。数组dp[i]表示能否到达下标为i的位置,对于从下标i=1开始的每一个位置,都从下标j=0开始到i-1判断能否到达j,并且判断从j开始最远能否跳到或超过i的位置,如果能,则令dp[i]...原创 2018-07-07 14:47:08 · 539 阅读 · 0 评论 -
LintCode:170 旋转链表
描述给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数样例给出链表1->2->3->4->5->null和k=2返回4->5->1->2->3->null分析:首先,遍历一遍链表得到链表长度len和原链表最后一个结点pNode。然后k=k%len,如果k为0,表示移动后为本身,直接返回head...原创 2018-07-19 10:39:56 · 238 阅读 · 0 评论 -
LintCode:110.最小路径和(动态规划)
描述给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。你在同一时间只能向下或者向右移动一步分析:典型的动态规划题。dp数组为m+1行,n+1列。dp[i][j]表示到网格(i,j)处时的最小路径和,可表示为dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1],但注意第一行和第一列的元素只能从其左边元素和上边元素得到,...原创 2018-07-05 13:40:27 · 501 阅读 · 0 评论 -
LintCode:124.最长连续序列
题目:描述给定一个未排序的整数数组,找出最长连续序列的长度。说明要求你的算法复杂度为O(n)样例给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4],返回所求长度 4分析:由题可以看出要求时间复杂度为O(n),所以排序不能使用。想到使用hashset数据结构保存数组元素,然后依次遍历数组,对于每一个数组元素,分别找到其下一个元素right和上一个元素...原创 2018-07-05 11:24:05 · 498 阅读 · 0 评论 -
Lintcode:136.切割回文串 VS 108. 切割回文串II(考点:回溯法、DFS、DP)
136. 切割回文串描述给定一个字符串s,将s分割成一些子串,使每个子串都是回文串。返回s所有可能的回文串分割方案。样例给出 s = "aab",返回[ ["aa", "b"], ["a", "a", "b"]]分析:本题采用回溯法,深度优先遍历字符串。注意保存子结果的条件以及每次返回上一层时(回溯时),需要把子结果中的在该层添加的(最后添加的)删掉再返回上一层。public c原创 2018-07-11 11:03:50 · 314 阅读 · 0 评论 -
LintCode:买股票的最佳时机系列
LintCode 149:假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。分析:因为只能买卖一次,所以应该选择价格最低的买入,价格最高的卖出,用变量保存最小的买进值,并得到当前卖出所得的利润,与当前最大利润相比选择较大的。public int maxProfit1(int[] prices...原创 2018-07-17 10:35:32 · 253 阅读 · 0 评论 -
LintCode:119.编辑距离(动态规划)
描述给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。你总共三种操作方法:插入一个字符删除一个字符替换一个字符分析:采用动态规划解题,初始化dp数组,int[][] dp=new int[word1.length+1][word2.length+1],dp[i][j]表示到word1下标为i,word2下标为j时的最小编辑距离。当i=0时,dp[0][j]=j...原创 2018-07-09 15:08:26 · 536 阅读 · 0 评论 -
LintCode:139.最接近零的子数组和
描述给定一个整数数组,找到一个和最接近于零的子数组。返回第一个和最右一个指数。你的代码应该返回满足要求的子数组的起始位置和结束位置您在真实的面试中是否遇到过这个题? 是样例给出[-3, 1, 1, -3, 5],返回[0, 2],[1, 3], [1, 1], [2, 2] 或者 [0, 4]。挑战O(nlogn)的时间复杂度分析:定义一个pair结构有两个成员变量 sum和 index,表示的...原创 2018-07-08 21:35:11 · 501 阅读 · 0 评论 -
LintCode:100. 删除排序数组中的重复数字VS 101. 删除排序数组中的重复数字II
描述给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。样例给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]。分析:遍历数组,定义变量size=0,从nums[size]开始依次与nums中每一个元素比较,若相等,则比较后一个元素;若不等,则将size+1,将nums[s...原创 2018-06-30 15:18:42 · 182 阅读 · 0 评论 -
LintCode:701. 修剪二叉搜索树
题目:修建二叉树,使得树中所有的结点值在区间[a,b]之间。输入:输出:思路:关于二叉树的题,大部分都采用递归的方法来做。当root位于L和R之间时,递归的修剪其左右子树,并返回root。当root的值小于L,其左子树都小于L,故舍弃其左子树,递归的修剪其右子树,并返回修剪后的右子树。当root的值大于L,其右子树都大于L,故舍弃其右子树,递归的修剪其左子树,并返回修剪后的左子树。如果root的值...原创 2018-06-10 23:35:25 · 329 阅读 · 0 评论 -
LintCode:134.LRU缓存策略
描述为最近最少使用(LRU)缓存策略设计一个数据结构,它应该支持以下操作:获取数据(get)和写入数据(set)。获取数据get(key):如果缓存中存在key,则获取其数据值(通常是正数),否则返回-1。写入数据set(key, value):如果key还没有在缓存中,则写入其数据值。当缓存达到上限,它应该在写入新数据之前删除最近最少使用的数据用来腾出空闲位置。分析可以定义一个双向链表来实现元素...原创 2018-06-29 20:21:36 · 397 阅读 · 0 评论 -
LintCode: 41. 连续子数组的最大和(最大子数组I) VS 42. 最大子数组II
方法一:考虑所有情况,时间复杂度O(n^2)。public int FindGreatestSumOfSubArray(int[] array) { if(array.length<=0) return 0; int maxOfAllSubArray=Integer.MIN_VALUE; for(int i=0;i<array.lengt...原创 2018-03-10 23:42:40 · 158 阅读 · 0 评论 -
LintCode: 889 屏幕句子适配
分析:直接采用暴力法解决,对于每一行,分析该行可以容纳的单词数,这涉及到列数与单词长度之间的大小关系。public class Solution { /** * @param sentence: a list of string * @param rows: an integer * @param cols: an integer * @return...原创 2018-05-25 10:14:07 · 380 阅读 · 0 评论 -
LintCode:875. Longest Line of Consecutive One in Matrix
题目:Given a 01 matrix m, find the longest line of consecutive one in the matrix. The line could be horizontal, vertical, diagonal or anti-diagonal.思路:题目的意思就是求一个给定二维矩阵上在水平方向、垂直方向、对角线方向和反对角线方向上连续1的最大个数。可...原创 2018-03-29 13:33:17 · 222 阅读 · 0 评论 -
LintCode:177. 把排序数组转换为高度最小的二叉搜索树
题目:思路:直接采用中间值来作为二叉树的根节点;将原数组分成左右均等或者相差一个数的两个新数组;然后递归的对这两个新数组进行相同的处理,这样对于每一个根节点,其左右子树的高度相差绝对值不会超过1,也就是满足了二叉平衡树的要求了。/** * Definition of TreeNode: * public class TreeNode { * public int val; * ...原创 2018-03-28 16:28:58 · 182 阅读 · 0 评论 -
动态规划之背包问题及输出背包具体方案
题型1:LintCode 92. 背包问题题目:在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]。分析:dp[i][j]:当背包总重量为j且目前有i个物品时,背包最多装满dp[i][j]的空间。 状态转移方程为:dp[i][j]=max{dp[i-1][j-A[i-1]]+A[i-1], dp[i-1][j]},其中dp[i-1][j-A[...原创 2018-03-28 15:16:31 · 7207 阅读 · 0 评论 -
动态规划之钢条切割
题目:给一个 n 英寸长的杆子和一个包含所有小于 n 的尺寸的价格. 确定通过切割杆并销售碎片可获得的最大值.例如,如果棒的长度为8,并且不同长度部件的值如下,则最大可获得值为 22(通过切割两段长度 2 和 6 )分析:场景:把长钢条切割为短钢条出售。切割工序本身无成本。求最佳切割方案。假定:出售一段长度为 i 英寸的钢条的价格为Pi(i = 1, 2, …, )单位:$,钢条长度均为整英寸。下...原创 2018-03-28 11:35:43 · 901 阅读 · 0 评论 -
LintCode:427. 生成括号
题目:分析:采用递归的方法,分别记录左括号数和右括号数,如果左括号数大于右括号数,既可以加左括号,又可以加右括号;否则,只可以加左括号;直到左括号数为n,然后补齐右括号即可。public class Solution { /** * @param n: n pairs * @return: All combinations of well-formed parenthe...原创 2018-04-10 20:06:11 · 223 阅读 · 0 评论 -
LintCode:532 逆序对
题目:分析:方法一:找出所有的数对,在判断它们是否为逆序对,时间复杂度为O(n^2),因此很可能不能通过。public long reversePairs(int[] A) { // write your code here long count=0; for(int i=0;i<A.length-1;i++){ for...原创 2018-04-15 16:09:14 · 340 阅读 · 0 评论 -
剑指offer(LintCode):表示数值的字符串
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。分析:主要考察字符串中的加减标记符号、e或E符号、小数点以及原创 2018-03-19 20:53:14 · 183 阅读 · 0 评论 -
LintCode:691.二叉搜索树交换节点
题目:分析:因为是二叉搜索树,所以最直观的做法就是采取中序遍历,得到有序的数列,其中肯定存在两处逆序,我们需要做的是把逆序部分交换使得该序列是递增的。比如题中的例子,上面的二叉树中序遍历结果为 15342,存在逆序对53和42,而下面的二叉树序列为12345,我们只需要把第一个逆序对的第一个数字和第二个逆序对的第二个数字交换即可得到12345。另外,找到这两个被交换的节点后,只需要改变这两个节点的...原创 2018-03-26 20:30:08 · 513 阅读 · 0 评论