青少年编程知识记录 codecoming

【题解】装满杯子需要的最短总时长

【题目描述】

现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。

给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。

【输入描述】

一行,3个数,分别表示需要装满冷水、温水和热水的杯子数量。

【输出描述】

一行一个数,所需的最少秒数

【样例1输入】

1 4 2

【样例1输出】

4

【样例1解释】

下面给出一种方案:  第 1 秒:装满一杯冷水和一杯温水。  第 2 秒:装满一杯温水和一杯热水。  第 3 秒:装满一杯温水和一杯热水。  第 4 秒:装满一杯温水。  可以证明最少需要 4 秒才能装满所有杯子。

【样例2输入】

5 4 4

【样例2输出】

7

【样例2解释】

下面给出一种方案:  第 1 秒:装满一杯冷水和一杯热水。  第 2 秒:装满一杯冷水和一杯温水。  第 3 秒:装满一杯冷水和一杯温水。  第 4 秒:装满一杯温水和一杯热水。  第 5 秒:装满一杯冷水和一杯热水。  第 6 秒:装满一杯冷水和一杯温水。  第 7 秒:装满一杯热水。

【样例3输入】

5 0 0

【样例3输出】

5

【样例3解释】

每秒装满一杯冷水
作者:亿万年的星光 分类:题解目录 浏览:

【题解】使每位学生都有座位的最少移动次数

【题目描述】



一个房间里有 n 个 空闲 座位和 n 名 站着的 学生,房间用一个数轴表示。给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数组 students ,其中 students[j] 是第 j 位学生的位置。

你可以执行以下操作任意次:

  • 增加或者减少第 i 位学生的位置,每次变化量为 1 (也就是将第 i 位学生从位置 x 移动到 x + 1 或者 x - 1

请你返回使所有学生都有座位坐的 最少移动次数 ,并确保没有两位学生的座位相同。

请注意,初始时有可能有多个座位或者多位学生在 同一 位置。

【输入描述】

三行,第一行一个数n,表示有n个空格和n名同学。

第二行n个数,表示n个座位

第三行n个数,表示n个学生

【输出描述】

一行一个数,表示最少移动次数。

【样例1输入】

3  3 1 5  2 7 4

【样例1输出】

4

【样例1解释】

学生移动方式如下:  - 第一位学生从位置 2 移动到位置 1 ,移动 1 次。  - 第二位学生从位置 7 移动到位置 5 ,移动 2 次。  - 第三位学生从位置 4 移动到位置 3 ,移动 1 次。  总共 1 + 2 + 1 = 4 次移动。

【样例2输入】

4  4 1 5 9  1 3 2 6

【样例2输出】

7

【样例2解释】

学生移动方式如下:  - 第一位学生不移动。  - 第二位学生从位置 3 移动到位置 4 ,移动 1 次。  - 第三位学生从位置 2 移动到位置 5 ,移动 3 次。  - 第四位学生从位置 6 移动到位置 9 ,移动 3 次。  总共 0 + 1 + 3 + 3 = 7 次移动。

【样例3输入】

4  2 2 6 6  1 3 2 6

【样例3输出】

4

【样例3解释】

学生移动方式如下:  - 第一位学生从位置 1 移动到位置 2 ,移动 1 次。  - 第二位学生从位置 3 移动到位置 6 ,移动 3 次。  - 第三位学生不移动。  - 第四位学生不移动。  总共 1 + 3 + 0 + 0 = 4 次移动。

【数据范围】

  • n == seats.length == students.length

  • 1 <= n <= 100

  • 1 <= seats[i], students[j] <= 100

作者:亿万年的星光 分类:题解目录 浏览:

【题解】转换字符串的最少操作次数

【题目描述】

给你一个字符串 s ,由 n 个字符组成,每个字符不是 'X' 就是 'O' 。

一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 'O' 。注意,如果字符已经是 'O' ,只需要保持 不变 。

返回将 s 中所有字符均转换为 'O' 需要执行的 最少 操作次数。

【输入描述】

一行字符串,由XO构成

【输出描述】

一行一个数,表示最少操作次数

【样例1输入】

XXX

【样例1输出】

1

【样例1解释】

XXX -> OOO  一次操作,选中全部 3 个字符,并将它们转换为 'O' 。

【样例2输入】

XXOX

【样例2输出】

2

【样例2解释】

XXOX -> OOOX -> OOOO  第一次操作,选择前 3 个字符,并将这些字符转换为 'O' 。  然后,选中后 3 个字符,并执行转换。最终得到的字符串全由字符 'O' 组成。

【样例3输入】

OOOO

【样例3输出】

0

【样例3解释】

不存在需要转换的 'X' 。
作者:亿万年的星光 分类:题解目录 浏览:

【题解】最少操作使数组递增

【题目描述】

给你一个整数数组 nums (下标从 0 开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1 。

比方说,如果 nums = [1,2,3] ,你可以选择增加 nums[1] 得到 nums = [1,3,3] 。

请你返回使 nums 严格递增 的 最少 操作次数。

我们称数组 nums 是 严格递增的 ,当它满足对于所有的 0 <= i < nums.length - 1 都有 nums[i] < nums[i+1] 。一个长度为 1 的数组是严格递增的一种特殊情况。

【输入描述】

一行,表示nums数组,每个数用空格隔开。

【输出描述】

一行,表示最少操作次数。

【样例1输入】

1 1 1

【样例1输出】

3

【样例1解释】

解释:你可以进行如下操作:  1) 增加 nums[2] ,数组变为 [1,1,2] 。  2) 增加 nums[1] ,数组变为 [1,2,2] 。  3) 增加 nums[2] ,数组变为 [1,2,3] 。

【样例2输入】

1 5 2 4 1

【样例2输出】

14

【样例3输入】

8

【样例3输出】

0
作者:亿万年的星光 分类:题解目录 浏览:

【题解】最小子序列

【题目描述】

给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。

如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。

与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。

注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。

【输入描述】

包含一行,每个数用空格隔开。

【输出描述】

包含一行,满足条件的子序列。每个数用空格隔开。

【样例1输入】

4 3 10 9 8

【样例1输出】

10 9

【样例1解释】

子序列 [10,9] 和 [10,8] 是最小的、满足元素之和大于其他各元素之和的子序列。但是 [10,9] 的元素之和最大。

【样例2输入】

4 4 7 6 7

【样例2输出】

7 7 6

【样例2解释】

子序列 [7,7] 的和为 14 ,不严格大于剩下的其他元素之和(14 = 4 + 4 + 6)。因此,[7,6,7] 是满足题意的最小子序列。注意,元素按非递增顺序返回。

【提示】

  • 1 <= nums.length <= 500

  • 1 <= nums[i] <= 100

作者:亿万年的星光 分类:题解目录 浏览:

【题解】种花问题

【题目描述】

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。

【输入描述】

两行,第一行表示flowerbed,

第二行一个数n,表示要种入n朵花

【输出描述】

一行,true或者false

【样例1输入】

1 0 0 0 1  1

【样例1输出】

true

【样例2输入】

1 0 0 0 1  2

【样例2输出】

false

【提示】

  • 1 <= flowerbed.length <= 2 * 104

  • flowerbed[i] 为 0 或 1

  • flowerbed 中不存在相邻的两朵花

  • 0 <= n <= flowerbed.length

作者:亿万年的星光 分类:题解目录 浏览:

【题解】运动员和训练师的最大匹配数

【题目描述】

给你一个下标从 0 开始的整数数组 players ,其中 players[i] 表示第 i 名运动员的 能力 值,同时给你一个下标从 0 开始的整数数组 trainers ,其中 trainers[j] 表示第 j 名训练师的 训练能力值 。

如果第 i 名运动员的能力值 小于等于 第 j 名训练师的能力值,那么第 i 名运动员可以 匹配 第 j 名训练师。除此以外,每名运动员至多可以匹配一位训练师,每位训练师最多可以匹配一位运动员。

请你返回满足上述要求 players 和 trainers 的 最大 匹配数。

【输入描述】

3行,第一行m和n表示运动员和训练师

第二行是m个运动员的能力值,

第三行是n个训练师的训练值

【输出描述】

最大匹配数

【样例1输入】

3 4  4 7 9  8 2 5 8

【样例1输出】

2

【样例1解释】

得到两个匹配的一种方案是:  - players[0] 与 trainers[0] 匹配,因为 4 <= 8 。  - players[1] 与 trainers[3] 匹配,因为 7 <= 8 。  可以证明 2 是可以形成的最大匹配数。

【样例2输入】

3 1  1 1 1  10

【样例2输出】

1

【样例2解释】

训练师可以匹配所有 3 个运动员  每个运动员至多只能匹配一个训练师,所以最大答案是 1 。

【数据范围】

  • 1 <= players.length, trainers.length <= 105

  • 1 <= players[i], trainers[j] <= 109

作者:亿万年的星光 分类:题解目录 浏览:

【题解】分发饼干

【题目描述】

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。

【输入描述】

3行,第一行n和m表示有n个孩子的胃口,m表示有块饼干。

第二行是这n个孩子的胃口,每个数中间用空格隔开

第三行是m块饼干的尺寸。

【输出描述】

满足尽可能多的最大数值

【样例1输入】

3 2  1 2 3  1 1

【样例1输出】

1

【样例1解释】

你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。  虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。  所以你应该输出 1。

【样例2输入】

2 3  1 2  1 2 3

【样例2输出】

2

【样例2解释】

你有两个孩子和三块小饼干,2 个孩子的胃口值分别是 1,2。  你拥有的饼干数量和尺寸都足以让所有孩子满足。  所以你应该输出 2。

【数据范围】

  • 1 <= g.length <= 3 * 104

  • 0 <= s.length <= 3 * 104

  • 1 <= g[i], s[j] <= 231 - 1

作者:亿万年的星光 分类:题解目录 浏览:

【题解】分糖果问题

【题目描述】



一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:

  1. 每个孩子不管得分多少,起码分到一个糖果。

  2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)

给定一个数组 arrarr 代表得分数组,请返回最少需要多少糖果。

【输入描述】

一行,包含n个数

【输出描述】

一行一个数,表示最少需要多少糖果

【样例输入1】

1 1 2

【样例输出1】

4

【样例1解释】

最优分配方案为1 1 2

【样例2输入】

1 1 1

【样例2输出】

3

【样例2解释】

最优分配方案是1,1,1



作者:亿万年的星光 分类:题解目录 浏览:

【题解】柠檬水找零

【题目描述】

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

【输入描述】

输入一行,n个数。

【样例输出】

是否能正确找零

【样例输入1】

5 5 5 10 20

【样例输出1】

true

【样例1解释】

前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。  第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。  第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。  由于所有客户都得到了正确的找零,所以我们输出 true。

【样例输入2】

5 5 10 10 20

【样例输出2】

false

【样例2解释】

前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。  对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。  对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。  由于不是每位顾客都得到了正确的找零,所以答案是 false。

【提示】

  • 1 <= bills.length <= 105

  • bills[i] 不是 5 就是 10 或是 20 

作者:亿万年的星光 分类:题解目录 浏览: