LintCode
零一熊
这个作者很懒,什么都没留下…
展开
-
LintCode 404.子数组求和Ⅱ
给定一个正整数数组 A 和一个区间. 返回和在给定区间范围内的子数组数量.**区间i到j的和等于 sum[j+1] - sum[i]sum[i]表示数组A中前i个元素的和现在求start<=sum[j+1]-sum[i]<=end可以通过遍历j 确定sum[i]的区间范围 去找j前面有多少个区间满足条件找到大于左边界的最小元素下标和小于等于右边界的最大元素下标为了用一个函数同时求两个下标(二分法) 可以直接求大于等于右边界+1的最小下标 即为j+1直接与i作差就得到了区间长度 即满原创 2021-05-02 13:47:36 · 146 阅读 · 0 评论 -
LintCode 86.二叉查找树迭代器
设计实现一个带有下列属性的二叉查找树的迭代器:next()返回BST中下一个最小的元素元素按照递增的顺序被访问(比如中序遍历)next()和hasNext()的询问操作要求均摊时间复杂度是O(1)将根节点及其所有左孩子加入栈中每调用一次next方法 栈顶元素出栈 将其右孩子的所有左孩子加入栈中若无右孩子 则会自下向上按中序遍历不断从栈中弹出元素/** * Definition of TreeNode: * public class TreeNode { * public int原创 2021-05-01 15:53:19 · 92 阅读 · 0 评论 -
LintCode 601.摊平二维向量
设计一个迭代器来实现摊平二维向量的功能方法与528题摊平链表相同先用中间栈将二维向量摊平为一维的多个链表在hasNext方法中将链表栈中第一个链表处理 通过中间栈调整顺序加入主体栈public class Vector2D implements Iterator<Integer> { Stack<List<Integer>> stack; Stack<Integer> stackj; void pushListList原创 2021-05-01 15:48:57 · 96 阅读 · 0 评论 -
LintCode 528.摊平嵌套的链表
给你一个嵌套的列表,实现一个迭代器将其摊平。一个列表的每个元素可能是整数或者一个列表。双栈实现用一个中间栈调整正确的元素顺序在hasNext方法中去处理下个元素若为数字 直接pop若为链表 将链表元素加入中间栈 再添加回主体栈中/** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implem原创 2021-05-01 15:45:26 · 94 阅读 · 0 评论 -
LintCode 508.摆动排序
给你一个没有排序的数组,请将原数组就地重新排列满足如下性质nums[0] <= nums[1] >= nums[2] <= nums[3]…遍历数组奇数位元素若比前一个元素小 交换偶数位元素若比前一个元素大 交换public class Solution { /* * @param nums: A list of integers * @return: nothing */ public void wiggleSort(int[] n原创 2021-05-01 15:40:01 · 112 阅读 · 0 评论 -
LintCode 507.摆动排序Ⅱ
给你一个数组nums,将它重排列如下形式nums[0] < nums[1] > nums[2] < nums[3]…通过Partition求出数组元素的中位数创建一个新数组 初始化为中位数将比中位数小的元素插入偶数位将比中位数大的元素插入奇数位要从分奇偶从两边进行插入 因为中位数存在相同多个的情况同方向插入会导致中位数都挤在末尾两边向中间插入会把中位数分在两段public class Solution { /* * @param nums: A list原创 2021-05-01 15:37:47 · 114 阅读 · 0 评论 -
LintCode 606.第K大的元素Ⅱ
找到数组中第K大的元素,N远大于K。请注意你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素Partition随机选取一个数组元素pivot 将数组分成两部分 左边小于pivot 右边大于pivot看k落在哪段区间上 对这段区间继续partition直到pivot的位置与k相同 返回pivotpublic class Solution { /** * @param nums: an integer unsorted array * @param k原创 2021-05-01 15:32:18 · 83 阅读 · 0 评论 -
LintCode 403.连续子数组求和Ⅱ
给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大。输出答案时,请分别返回第一个数字和最后一个数字的值。如果多个答案,请返回其中任意一个。取反法假设不循环求出最大值 与402题做法相同求出最小值 用数组元素和减去最小值 即为可以循环条件下的最大值两者中的最大值即为答案public class Solution { /* * @param A: An integer array * @return: A list of integers i原创 2021-05-01 15:28:35 · 108 阅读 · 0 评论 -
LintCode 402.连续子数组求和
给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大。输出答案时,请分别返回第一个数字和最后一个数字的下标。(如果存在多个答案,请返回字典序最小的)for循环数组元素用一个sum记录可能的最大元素和若sum为负 则sum等于当前元素 更新起始和终点坐标若sum不为负 将当前元素加入sum 更新终点坐标若sum大于最大值 将坐标存入listpublic class Solution { /* * @param A: An integer array * @ret原创 2021-05-01 15:24:13 · 128 阅读 · 0 评论 -
LintCode 405.和为零的子矩阵
给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标。如果有多个答案, 你可以返回其中任意一个.预处理一个二维数组 记录矩阵中每个点左上方矩阵的元素之和for循环起始行和终止行遍历列坐标 预处理数组中终止行对应元素减去起始行终止元素等于该区间矩阵和存入HashMap 新的区间要更新新的HashMap若遍历中发现HashMap中有重复元素 说明这两个矩阵大小相等 中间的小矩阵即为和为0的矩阵public class Solution { /原创 2021-05-01 15:18:07 · 109 阅读 · 0 评论 -
LintCode138.子数组之和
给定一个整数数组,找到和为 0 的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置**HashMap遍历nums数组 将每个点及其前面的元素和存入HashMap的Key 将该点坐标存入Value若某个点的和已经存在于HashMap中 说明在这个点之前有一个点到该点直接的元素和为0返回这两个点的坐标HashMap中预先存入一个0点 检查第一个元素是否为0**public class Solution { /** * @param nums: A list of in原创 2021-05-01 15:10:23 · 145 阅读 · 0 评论 -
LintCode 89.k Sum
给定 n 个不同的正整数,整数 k(k <= n)以及一个目标数字 target。 在这 n 个数里面找出 k 个数,使得这 k 个数的和等于目标数字,求问有多少种方案?背包问题动态规划在背包问题的基础上加了一个维度 限定选择元素的个数dp数组中的某个点代表 在前i个元素中选j个恰好等于k的方案数转移方程为 选择当前元素的方案数加上不选择当前元素的方案数public class Solution { /** * @param A: An integer array原创 2021-04-30 09:21:57 · 117 阅读 · 0 评论 -
LintCode 394.硬币排成线
有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。请判定 先手玩家 必胜还是必败?若必胜, 返回 true, 否则返回 false.动态规划dp数组每个点代表先手拿当前数量硬币 必胜还是必败每次拿硬币到下一次先手有两种选择 四种情况 dfs0代表当前点未搜索过 1代表必胜 2代表必败对手一定会选择让自己输的情况所以对于一种选择的两种情况用&&public class Solution { /**原创 2021-04-30 07:36:42 · 100 阅读 · 0 评论 -
LintCode 398.最长上升连续子序列Ⅱ
给定一个整数矩阵. 找出矩阵中的最长连续上升子序列, 返回它的长度.最长连续上升子序列可以从任意位置开始, 向上/下/左/右移动.动态规划-记忆化搜索对每个点周围四个点中比它小的点进行搜索 其中最长路径+1为当前点最长路径对搜索过的点用二维数组记录public class Solution { int[][] dp; int[][] flag; public int longestContinuousIncreasingSubsequence2(int[][] matrix原创 2021-04-29 19:47:24 · 137 阅读 · 0 评论 -
LintCode 395.硬币排成线Ⅱ
有 n 个不同价值的硬币排成一条线。两个参赛者轮流从 左边 依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。请判定 先手玩家 必胜还是必败?若必胜, 返回 true, 否则返回 false.博弈型动态规划dp数组每个点代表先手选择n个硬币 是否可以获胜赢得关键是让对手选到更少价值的硬币 自己拿到价值总和的一半以上 就可以获得胜利每次选择都有四种情况 分别dfs用二维数组记录搜索过的情况 避免重复public class Solution {原创 2021-04-29 19:45:42 · 103 阅读 · 0 评论 -
LintCode396.硬币排成线Ⅲ
有 n 个硬币排成一条线, 第 i 枚硬币的价值为 values[i].两个参赛者轮流从任意一边取一枚硬币, 直到没有硬币为止. 拿到硬币总价值更高的获胜.请判定 第一个玩家 会赢还是会输.博弈型动态规划问题记忆化搜索 画出搜索树即选择情况 利于判断当前点状态用二维数组记录已经搜索过的区间每次先手要么从左边选或右边选 对手同样左边选的最小值和右边选的最小值中的最大值是当前应该选的状态public class Solution { /** * @param values: a原创 2021-04-29 19:42:26 · 213 阅读 · 0 评论 -
LintCode 476.石子归并
有一个石子归并的游戏。最开始的时候,有n堆石子排成一列,目标是要将所有的石子合并成一堆。合并规则如下:每一次可以合并相邻位置的两堆石子每次合并的代价为所合并的两堆石子的重量之和求出最小的合并代价。区间型动态规划dp数组每个点代表合并从序号i到j石子的最小代价对所有可能的划分区间进行遍历对左右两个区间进行搜索 dfs用一个二维数据记录搜索过的区间public class Solution { /** * @param A: An integer array * @原创 2021-04-29 19:34:17 · 87 阅读 · 0 评论 -
LintCode168.吹气球
有n个气球,编号为0到n-1,每个气球都有一个分数,存在nums数组中。每次吹气球i可以得到的分数为 nums[left] * nums[i] * nums[right],left和right分别表示i气球相邻的两个气球。当i气球被吹爆后,其左右两气球即为相邻。要求吹爆所有气球,得到最多的分数。**区间型动态规划问题+记忆化搜索从大到小 类似分治的思想dp数组代表吹爆序号i到j的气球得到的最多分数为了方便边界两个气球的运算 在左右边界添加一个元素1用一个二维数组记录已经搜索过的区间情况对数组每个原创 2021-04-29 19:30:31 · 160 阅读 · 0 评论 -
LintCode 92.背包问题
在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]动态规划+滚动数组优化用背包容量作为纵坐标, n个物品作为纵坐标每个点代表当前i个物品能否填满j容量每个点都有两种可能状态 选择或不选当前行所代表的物品由于每一行仅与其上一行的状态有关数组可以仅保存两行信息 对所有行坐标%2 减小空间复杂度public class Solution { /** * @param m: An integer m denotes the size of a原创 2021-04-29 19:24:35 · 108 阅读 · 0 评论 -
LintCode 125.背包问题Ⅳ
给出 n 个物品, 以及一个数组, nums[i]代表第i个物品的大小, 保证大小均为正数并且没有重复, 正整数 target 表示背包的大小, 找到能填满背包的方案数。**动态规划以背包容量为纵坐标 n个物品为横坐标每个点代表用i个物品恰好填满j容量的方案数每个点要么不选当前行代表的物品要么选当前行代表的物品**public class Solution { /** * @param nums: an integer array and all positive numbe原创 2021-04-29 19:20:05 · 234 阅读 · 0 评论 -
LintCode 631.最大矩阵Ⅱ
给出一个只有 0 和 1 组成的二维矩阵。找出最大的一个子矩阵,使得这个子矩阵的主对角线元素均为 1 ,其他元素均为 0 。你可以认为所求的矩阵一定是一个方阵。主对角线指的是从左上角到右下角的一条对角线。动态规划初始化两个二维数组 分别记录每个点及其上面0的个数喝每个点及其左边0的个数dp数组每个点代表当前最大矩阵的边长用矩阵的右下角作为定位点 dp数组每个为1的点上面和左面0的个数和左上的值 三者最小值+1为当前点的最大矩阵public class Solution { /**原创 2021-04-29 19:12:13 · 125 阅读 · 0 评论 -
LintCode 390.寻找峰值Ⅱ
给定一个整数矩阵 A, 它有如下特性:相邻的整数不同矩阵有 n 行 m 列,n和m不会小于3。对于所有的 i < n, 都有 A[i][0] < A[i][1] && A[i][m - 2] > A[i][m - 1]对于所有的 j < m, 都有 A[0][j] < A[1][j] && A[n - 2][j] > A[n - 1][j]我们定义一个位置 [i,j] 是峰值, 当且仅当它满足:A[i][j] > A[i原创 2021-04-28 17:11:45 · 133 阅读 · 0 评论 -
LintCode 586.对x开根Ⅱ
实现 double sqrt(double x) 并且 x >= 0。计算并返回x开根后的值。由于存在小数精确度的问题所以在二分区间取值区间的时候 左右区间指针的差值在小于精确度的情况下 循环才应该结束若x小于1 右指针应为1 因为小数开根会变大public class Solution { /** * @param x: a double * @return: the square root of x */ public double sqrt原创 2021-04-28 17:02:32 · 113 阅读 · 0 评论 -
LintCode 183.木材加工
有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。给定L和k,你需要计算能够得到的小段木头的最大长度。二分法小段木头的长度区间为[0,最长的那根木头]对长度区间进行二分 判断mid长度是否可以用现有木头分成k段若可以分成k段 说明小段木头可能更长 删除比mid短的区间 反之同理public class Solution { /** * @param L: Given n pieces of wood with length L[i]原创 2021-04-28 16:56:27 · 228 阅读 · 0 评论 -
LintCode 437.书籍复印
给定n本书,第i本书有[i]页。有k个人来抄这些书。这些书排成一行,每个人都可以索取连续一段的书。例如,一个复印机可以连续地将书从第i册复制到第j册,但是他不能复制第1册、第2册和第4册(没有第3册)。他们在同一时间开始抄书,每抄一页书都要花1分钟。为了让最慢的复印机能在最早的时间完成书的分配,最好的策略是什么?请返回最慢复印机花费的最短时间。二分法书籍复印的时间范围为[页数最多的那本书,页数和]对时间范围进行二分 判断mid时间k个人是否可以复印完成若可以完成 说明时间可以更短 比这个长的时原创 2021-04-28 16:53:13 · 154 阅读 · 0 评论 -
LintCode 131.大楼轮廓
水平面上有 N 座大楼,每座大楼都是矩阵的形状,可以用一个三元组表示 (start, end, height),分别代表其在x轴上的起点,终点和高度。大楼之间从远处看可能会重叠,求出 N 座大楼的外轮廓线。外轮廓线的表示方法为若干三元组,每个三元组包含三个数字 (start, end, height),代表这段轮廓的起始位置,终止位置和高度。扫描线+TreeSet对每栋楼的范围拆分 拆为若干个起始和终止点 并对这些点进行排序 - 扫描线用TreeSet来动态维护拆分出的每个点上各个楼的高度在扫描的原创 2021-04-28 16:45:11 · 160 阅读 · 0 评论 -
LintCode 391.数飞机
给出飞机的起飞和降落时间的列表,用序列 interval 表示. 请计算出天上同时最多有多少架飞机?扫描线对所有起飞和降落时间点进行排序扫描线检查每个点有多少架飞机 每到一个点 有起飞的飞机 天上飞机数量加1 有降落的减1过程中最大值即为天上同时最多有多少架飞机class Point{ int time; int flag; public Point(int time, int flag){ this.time = time;原创 2021-04-28 16:49:03 · 241 阅读 · 0 评论 -
LintCode 126.Max Tree
Given an integer array with no duplicates. A max tree building on this array is defined as follow:The root is the maximum number in the arrayThe left subtree and right subtree are the max trees of the subarray divided by the root number.Construct the ma原创 2021-04-26 16:52:59 · 100 阅读 · 0 评论 -
LintCode 575.字符串解码
给出一个表达式 s,此表达式包括数字,字母以及方括号。在方括号前的数字表示方括号内容的重复次数(括号内的内容可以是字符串或另一个表达式),请将这个表达式展开成一个字符串。用栈来存储信息 当遇到’]'时 进行出栈运算处理并将结果入栈public class Solution { /** * @param s: an expression includes numbers, letters and brackets * @return: a string */原创 2021-04-26 16:24:15 · 133 阅读 · 0 评论 -
LintCode 591.连通图Ⅲ
给一个图中的 n 个节点, 记为 1 到 n . 在开始的时候图中没有边.你需要完成下面两个方法:connect(a, b), 添加一条连接节点 a, b的边query(), 返回图中联通区域个数并查集每个节点看作一个集合 连接两条边即为合并两个父节点不同的集合每合并两个父节点不同的集合 连通区域数量-1public class ConnectingGraph3 { /** * @param a: An integer * @param b: An integer原创 2021-04-24 21:51:47 · 69 阅读 · 0 评论 -
LintCode 434.岛屿的个数Ⅱ
给定 n, m, 分别代表一个二维矩阵的行数和列数, 并给定一个大小为 k 的二元数组A. 初始二维矩阵全0. 二元数组A内的k个元素代表k次操作, 设第i个元素为 (A[i].x, A[i].y), 表示把二维矩阵中下标为A[i].x行A[i].y列的元素由海洋变为岛屿. 问在每次操作之后, 二维矩阵中岛屿的数量. 你需要返回一个大小为k的数组.并查集把每个陆地看作一个集合 当新添加的元素上下左右有陆地并且它们不在一个集合 把它们合并为一个集合每新创建一个陆地 至多会增加一个岛屿 每遇到一个不在同一原创 2021-04-24 21:45:35 · 99 阅读 · 0 评论 -
LintCode 129.重哈希
哈希表容量的大小在一开始是不确定的。如果哈希表存储的元素太多(如超过容量的十分之一),我们应该将哈希表容量扩大一倍,并将所有的哈希值重新安排。取出哈希表中的所有元素通过哈希函数重新计算位置 负数要特殊处理public class Solution { /** * @param hashTable: A list of The first node of linked list * @return: A list of The first node of linked list原创 2021-04-23 07:01:17 · 146 阅读 · 0 评论 -
LintCode 545.前K大数Ⅱ
实现一个数据结构,提供下面两个接口1.add(number) 添加一个元素2.topk() 返回此数据结构中最大的k个数字。当我们创建数据结构时,k是给定的。**用一个长度为k的优先队列来维护最大的k个数通过Iterator it = minheap.iterator()的方式取出优先队列中的元素再通过collections工具类 Collections.sort(list, Collections.reverseOrder())将元素顺序颠倒**public class Solution原创 2021-04-22 17:27:54 · 69 阅读 · 0 评论 -
LintCode 8.旋转字符串
给定一个字符串str和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转)。三次颠倒根据偏移量将数组划分为两部分 对这两部分分别颠倒(双指针首尾互换)再将数组整体颠倒public class Solution { /** * @param str: An array of char * @param offset: An integer * @return: nothing */ public void rotateString(char[]原创 2021-04-22 08:02:07 · 374 阅读 · 0 评论 -
LeetCode 143.颜色分类Ⅱ
给定一个有n个对象(包括k种不同的颜色,并按照1到k进行编号)的数组,将对象进行分类使相同颜色的对象相邻,并按照1,2,…k的顺序进行排序。通过时间复杂度推测用什么算法!k = 1, O(1)k = 2, O(n)k = 3, O(n)…k = n, O(nlogn) //每个元素都不相同 快速排序所以本题的算法的时间复杂度应为 nlogk故应该是将k个颜色分治归并 每一层都要对n个元素进行排序处理快速排序+归并排序public class Solution { /**原创 2021-04-22 07:48:11 · 104 阅读 · 0 评论 -
LeetCode 75.颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。相向双指针保证左指针左面全是0 右指针右面全是2 则中间自然全为1需要另外一个指针遍历元素 直到与右指针相遇遇到2将其和右指针交换 右指针–遇到1跳过遇到0与左指针交换 左指针++class Solution { public void sortColors(int[] nums) {原创 2021-04-22 07:36:04 · 77 阅读 · 0 评论 -
LintCode 382.三角形计数
给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?两个较小的边大于第三条边 则一定为三角形先排序遍历每个元素 在当前元素前面的区间 去找个俩个数的和大于当前元素public class Solution { /** * @param S: A list of integers * @return: An integer */ public int triangleCount(int[] S原创 2021-04-22 07:31:09 · 124 阅读 · 0 评论 -
LintCode 59.最接近的三数之和
给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。三指针其中一个指针遍历每个元素在每个元素的情况情况 左右相向指针 遍历每个三元组public int threeSumClosest(int[] numbers, int target) { int n = numbers.length; if(numbers == null || n < 3) return -1; Ar原创 2021-04-22 07:28:30 · 88 阅读 · 0 评论 -
LintCode 31.数组划分
给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:所有小于k的元素移到左边所有大于等于k的元素移到右边返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。类似与快速排序 相向双指针在左边找到一个大于等于k的元素 右边找到一个小于k的元素 交换位置public class Solution { /** * @param nums: The integer array you should partition原创 2021-04-22 07:25:34 · 155 阅读 · 0 评论 -
LintCode 144.交错正负数
给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。先将正负数分别存到两个数组当中 较长的那个数组作为起始元素(下标为0)按照奇偶将两个数组元素添加到新数组中 注意如果数组长度为奇数 需要对最后一个元素进行单独添加public class Solution { /* * @param A: An integer array. * @return: nothing */ public void rerange(int[] A) {原创 2021-04-22 07:22:28 · 101 阅读 · 0 评论