本文最后更新于:2023年3月19日 晚上
Lt455.分发饼干、Lt575.分糖果、Lt628.三个数的最大乘积
Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Easy (55.51%) |
196 |
- |
Tags
greedy
Companies
Unknown
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 g 这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 s。如果 s >= g,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
注意:
你可以假设胃口值为正。
一个小朋友最多只能拥有一块饼干。
示例 1:
1 2 3 4 5 6
| 输入: [1,2,3], [1,1] 输出: 1 解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 所以你应该输出1。
|
示例 2:
1 2 3 4 5 6
| 输入: [1,2], [1,2,3] 输出: 2 解释: 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出2.
|
Discussion | Solution
思路
贪心算法。将孩子和饼干排序,分别设置两个指针指向第一个。判断两个指针指向的饼干尺寸是否大于等于孩子的胃口,是的话,满足的孩子数量加一,如果小于这块饼干可以直接抛弃。直到两个指针其中一个遍历完数组结束循环,表示饼干没有了或孩子全部满足了。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
var findContentChildren = function (g, s) { const childs = g.sort((a, b) => Number(a) - Number(b)); const cookies = s.sort((a, b) => Number(a) - Number(b)); let child = 0; let cookie = 0; while (child < childs.length && cookie < cookies.length) { if (childs[child] <= cookies[cookie]) { child++; } cookie++; } return child; };
|
执行结果:
通过
显示详情
执行用时:120 ms, 在所有 JavaScript 提交中击败了 55.10%的用户
内存消耗:40.6 MB, 在所有 JavaScript 提交中击败了 11.47%的用户
Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Easy (67.49%) |
82 |
- |
TagsCompanies
给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。
示例 1:
1 2 3 4
| 输入: candies = 输出: 3 解析: 一共有三种种类的糖果,每一种都有两个。 最优分配方案:妹妹获得,弟弟也获得。这样使妹妹获得糖果的种类数最多。
|
示例 2 :
1 2 3
| 输入: candies = 输出: 2 解析: 妹妹获得糖果,弟弟获得糖果,妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。
|
注意:
- 数组的长度为[2, 10,000],并且确定为偶数。
- 数组中数字的大小在范围[-100,000, 100,000]内。
Discussion | Solution
思路
使用哈希表建立每个糖果及数量,按数量升序生成数组,遍历数组直到结果数组到达糖果总数的一半。每个糖果分类里取一个,就跳到下一个分类,如果没有下一个分类,就在当前分类取到上限。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
var distributeCandies = function (candies) { const map = new Map(); let i = 0; for (const item of candies) { map.set(item, map.get(item) ? map.get(item) + 1 : 1); } const sortArr = [...map.entries()].sort((a, b) => a[1] - b[1]); const res = []; while (res.length < candies.length / 2) { res.push(sortArr[i][0]); if (sortArr[i + 1]) { i++; } } return [...new Set(res)].length; };
|
1 2 3 4
| Accepted 205/205 cases passed (248 ms) Your runtime beats 24.65 % of javascript submissions Your memory usage beats 10 % of javascript submissions (54.9 MB)
|
Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Easy (50.43%) |
164 |
- |
Tags
array
| math
Companies
Unknown
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
示例 2:
注意:
- 给定的整型数组长度范围是[3,10],数组中所有的元素范围是[-1000, 1000]。
- 输入的数组中任意三个数的乘积不会超出 32 位有符号整数的范围。
Discussion | Solution
思路
将数组降序排序以后。若数组全为正数,则最大为前三个数的乘积。若数组存在负数,最大的乘积要么是前三个数的乘积,要么是两个最小的负数相乘再乘以最大的正数,即最后两个乘第一个
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
var maximumProduct = function (nums) { nums.sort((a, b) => Number(b) - Number(a)); return Math.max( nums[0] * nums[1] * nums[2], nums[0] * nums[nums.length - 2] * nums[nums.length - 1] ); };
|
1 2 3 4
| Accepted 83/83 cases passed (160 ms) Your runtime beats 23.4 % of javascript submissions Your memory usage beats 15.23 % of javascript submissions (42.6 MB)
|