刷题
伊库塔花花
这个作者很懒,什么都没留下…
展开
-
每日一题 按摩师选择预约时间
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动这道题与著名的小偷问题其实是相同的,小偷要偷到最多价值的东西,但是不能偷相邻的地方,选择最优序列。方法采用动态规划,一些边界条件注意判断。 public ...原创 2020-03-24 09:40:30 · 365 阅读 · 0 评论 -
每日一题 两个水桶问题
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。你允许:装满任意一个水壶清空任意一个水壶从一个水壶向另外一个水壶倒水,直到装满或者倒空方法一 深度优先遍历每次操作的选择有把 X 壶的水灌进 Y 壶,直至灌满或倒空;把 Y 壶的水灌进 X 壶,直至灌...原创 2020-03-21 10:18:07 · 3377 阅读 · 0 评论 -
每日一题 TOPK问题
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。这道题很经典,可以总结为求TOPK问题。解决方法主要有三个。方法一. 直接排序方法调用Java的排序方法进行排序,速度居中,代码简单。 public static int[] getLeastNumbers3(int[] arr, int k) { ...原创 2020-03-20 13:34:10 · 240 阅读 · 0 评论 -
每日一题 LeetCode 665 非递减数列
给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。这道题目的主要思路是找出原数列中出现递减的位置,因此用一个变量来记录出现递减的次数。如果递减次数大于1,说明至少两个地方的大小关系不...原创 2020-03-19 14:36:09 · 230 阅读 · 0 评论 -
leetcode 1043 分隔数组以得到最大和
给出整数数组 A,将该数组分隔为长度最多为 K 的几个(连续)子数组。分隔完成后,每个子数组中的值都会变为该子数组中的最大值。返回给定数组完成分隔后的最大和。示例:输入:A = [1,15,7,9,2,5,10], K = 3输出:84解释:A 变为 [15,15,15,9,10,10,10]这个问题最直观的想法是把每个组合可能都遍历一边,从中找到最优解。//用递归循环的方式 ...原创 2020-03-17 14:40:22 · 254 阅读 · 0 评论 -
每日一题 最大层内元素和
给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。来源:力扣(LeetCode)思路很简单,就是每层遍历,将每层的节点相加获得最大值,并记录当前层数。层次遍历借助于队列数据结构。 //按层遍历 public int maxLevelSum...原创 2020-03-17 13:13:27 · 137 阅读 · 0 评论 -
每日一题 多线程编程 1195. 交替打印字符串
采用信号量Semaphore进行线程控制,但是调试了半天总是不通过,一直提示超时,看了下通过的答案和我的设计是一样的,于是复制粘贴了一下发现竟然通过了。仔细看了一下,发现竟然是try-finally块没写就造成通不过了。finally块保证了线程一定会释放信号量。class FizzBuzz { private int n; private volatile int cnt;...原创 2020-03-16 16:30:57 · 272 阅读 · 0 评论 -
每日一题 leetcode 695. 岛屿的最大面积
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)来源:力扣(LeetCode)这个问题其实就是不断搜索与1相邻的1,并继续向下搜索,采用递归和搜索的方法可以实现。但是为了减少重复搜索,在计算过一...原创 2020-03-15 16:59:51 · 166 阅读 · 0 评论 -
LeetCode 300. 最长上升子序列及二分查找方法的多种应用
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?来源:力扣(LeetC...原创 2020-03-14 16:44:30 · 238 阅读 · 0 评论 -
leetCode 994 腐烂的橘子
在给定的网格中,每个单元格可以有以下三个值之一:值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。来源:力扣(LeetCode)采用广度优先遍历方式,记录遍历的层数,就是腐烂需要的时间。同样的方法也可以用于二叉树的按层...原创 2020-03-13 13:59:04 · 140 阅读 · 0 评论 -
leetCode 字符串最大公约分子
对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。来源:力扣(LeetCode)主要的问题在于如何判断问题是否有解。如果有解,那么两个字符串应该是nxS和mxS,可以通过str1+str2==str2+str1判断,两个字符串都是以相同公因...原创 2020-03-12 15:29:07 · 139 阅读 · 0 评论 -
leetcode 1013. 将数组分成和相等的三个部分
给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + … + A[i] == A[i+1] + A[i+2] + … + A[j-1] == A[j] + A[j-1] + … + A[A.length - 1]) 就可以将数组三等分。来源:力扣(LeetCod...原创 2020-03-11 15:48:04 · 108 阅读 · 0 评论 -
leetcode 442. 数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。 找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?这道题的条件中给出的数组取值范围是1-n,这使得这道题的难度降低了很多。由于数组取值是在数组下标范围内的,因此可以用下标的唯一性来判断元素是否重复初选。也就是遍历数组,对下标为a[i]的元素...原创 2019-11-07 15:47:24 · 177 阅读 · 0 评论 -
leetcode 1024. 视频拼接
你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。 视频片段 clips[i]都用区间进行表示:开始于 clips[i][0] 并于 clips[i][1] 结束。我们甚至可以对这些片段自由地再剪辑,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。我们需要将这些片段进行再剪辑,并将剪辑...原创 2019-11-04 13:01:55 · 5493 阅读 · 0 评论 -
leetcode 912. 排序数组
这道题就是纯粹的数组排序问题,救助这道题复习一下各种排序算法。选择排序这种排序方式应该是很简单的,容易理解,对于长度为n的数组,遍历n-1次,每次在无序的数组段中选择最小的一个元素和无序数组第一个元素交换位置。或者反过来,找最大的和最后一个交换,也是一样的。在交换过程中,相同元素的位置不会变化,因此是稳定的。不过判断的方式不同,导致的稳定性也不同。比如如果我写成nums[j]<=num...原创 2019-11-02 14:05:50 · 503 阅读 · 0 评论 -
1027. 最长等差数列 使用数组和使用map的时间效率
给定一个整数数组 A,返回 A 中最长等差子序列的长度。回想一下,A 的子序列是列表 A[i_1], A[i_2], …, A[i_k] 其中 0 <= i_1 < i_2 < … <i_k <= A.length - 1。并且如果 B[i+1] - B[i]( 0 <= i < B.length - 1)的值都相同,那么序列 B 是等差的。这...原创 2019-10-31 11:28:08 · 185 阅读 · 0 评论 -
leetcode 487. 最大连续1的个数 II 和 1004. 最大连续1的个数 III
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。 返回仅包含 1 的最长(连续)子数组的长度。487是1004的一种特殊情况,这里解决1004将连续序列中的若干个0翻转成1使得总长度最长,可以用一个尺子找到一个区间,使得区间内包含k个0,而且区间长度最长,也就是采用滑动窗口的解法。public int longestOnes(int[] A, in...原创 2019-10-29 13:00:48 · 288 阅读 · 0 评论 -
LeetCode 1033 移动石子直到连续 和 1040. 移动石子直到连续 II
题1033三枚石子放置在数轴上,位置分别为 a,b,c。每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。从位置 x 或者是位置 z拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < z 且 k != y。当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。要使游戏结束,你可以执行的最小和最大移动次...原创 2019-10-28 12:43:28 · 685 阅读 · 0 评论 -
leetcode 1226. 哲学家进餐
这是避免死锁的一个经典题目,虽然算法知道,但是一直没有写过代码,这里总结一下主要的实现方法。方法一,限制每次只能有一个哲学家吃饭,这种方法效率比较低,但是实现起来很简单,就是采用一个全局锁。本质上是同时获取所有的资源,而不是分步获取资源,打破持有并等待。class DiningPhilosophers1 { ReentrantLock lock=new ReentrantLock();...原创 2019-10-25 12:41:11 · 665 阅读 · 0 评论 -
leetcode 93. 复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。示例: 输入: “25525511135” 输出: [“255.255.11.135”, “255.255.111.35”]采用递归回溯的方法,基于IP地址的规则,添加长度,取值的约束条件,减少搜索次数。num 表示已经完成的IP分段,index表示将访问的下标,sb存储中间过程约束条件:剩余的长度不能太短,不能太...原创 2019-10-25 11:12:03 · 149 阅读 · 0 评论 -
leetcode 445. 两数相加 II
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。解决思路:1、翻转两个链表,从低位开始逐位相加,然后将结果翻转回去。需要多次遍历链表。2、采用额外的存储结构,用栈的特性将链...原创 2019-10-24 12:37:37 · 114 阅读 · 0 评论 -
leetcode 873. 最长的斐波那契子序列的长度
如果序列 X_1, X_2, …, X_n 满足下列条件,就说它是 斐波那契式 的: n >= 3 对于所有 i + 2 <= n,都有X_i + X_{i+1} = X_{i+2} 给定一个严格递增的正整数数组形成序列,找到 A中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。这个问题直接解的话,就是对所有解空间进行搜索,最后的时间复杂度是O(n^3),为了降...原创 2019-10-24 11:51:42 · 248 阅读 · 1 评论 -
leetcode 1014. 最佳观光组合
给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。这道题目直接的做法是遍历每一种组合,这里采用一种比较巧妙的方式,将A[i] + A[j] + i - j 拆分成A...原创 2019-10-23 15:44:24 · 150 阅读 · 0 评论 -
leetcode 468. 验证IP地址
题目:编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字...原创 2019-10-23 14:56:31 · 135 阅读 · 0 评论 -
LeetCode 1188. 设计有限阻塞队列 (生产者和消费者问题)
实现一个拥有如下方法的线程安全有限阻塞队列:BoundedBlockingQueue(int capacity) 构造方法初始化队列,其中capacity代表队列长度上限。void enqueue(int element) 在队首增加一个element. 如果队列满,调用线程被阻塞直到队列非满。int dequeue() 返回队尾元素并从队列中将其删除. 如果队列为空,调用线程被阻塞直到队列...原创 2019-10-23 13:50:04 · 2490 阅读 · 1 评论 -
Leetcode 325. 和等于 k 的最长子数组长度
获得和的值为跟定数的子数组的最长长度,采用map记录累加和,然后再后面做判断。累加和只记录第一次出现的位置,保证长度是最大的。class Solution { public int maxSubArrayLen(int[] nums, int k) { int sum=0; int max=0; HashMap<Integer,Inte...原创 2019-10-22 14:09:05 · 706 阅读 · 0 评论 -
Leetcode 718. 最长重复子数组
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释:长度最长的公共子数组是 [3, 2, 1]。说明 1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100解答:方法和求两个字符串的最长公共子串...原创 2019-10-22 10:56:25 · 138 阅读 · 0 评论