From fa05b232525e022c4ed6264db0928791c2a5009a Mon Sep 17 00:00:00 2001 From: luzhipeng Date: Fri, 12 Apr 2019 13:50:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=9B=9B=E6=B0=B4=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E9=A6=99=E8=95=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 + .../11.container-with-most-water-question.jpg | Bin 0 -> 18362 bytes problems/11.container-with-most-water.md | 138 ++++++++++++++++ problems/875.koko-eating-bananas.md | 155 ++++++++++++++++++ 4 files changed, 300 insertions(+) create mode 100644 assets/problems/11.container-with-most-water-question.jpg create mode 100644 problems/11.container-with-most-water.md create mode 100644 problems/875.koko-eating-bananas.md diff --git a/README.md b/README.md index 6ec17ca..ea33828 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,11 @@ leetcode 题解,记录自己的 leecode 解题之路。 > 只有熟练掌握基础的数据结构与算法,才能对复杂问题迎刃有余 +## 食用说明 + +- 经典题目的解析的目录部分,前面有🆕的代表是最新更新的 +- 将来会在这里更新anki卡片 + ## 精彩预告 @@ -79,6 +84,8 @@ leetcode 题解,记录自己的 leecode 解题之路。 - [900.rle-iterator](./problems/900.rle-iterator.md) - [322.coin-change](./problems/322.coin-change.md) - [518.coin-change-2](./problems/518.coin-change-2.md) +- 🆕 [11.container-with-most-water](./problems/11.container-with-most-water.md) +- 🆕 [875.koko-eating-bananas](./problems/875.koko-eating-bananas.md) #### 困难难度 diff --git a/assets/problems/11.container-with-most-water-question.jpg b/assets/problems/11.container-with-most-water-question.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7661efe42a9c4659500f272b4b6935f6fa031836 GIT binary patch literal 18362 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 V8G7N%`U{oAwQiU*77lvg{{a>dShfHF literal 0 HcmV?d00001 diff --git a/problems/11.container-with-most-water.md b/problems/11.container-with-most-water.md new file mode 100644 index 0000000..5e4dc9b --- /dev/null +++ b/problems/11.container-with-most-water.md @@ -0,0 +1,138 @@ +## 题目地址 +https://leetcode.com/problems/container-with-most-water/description/ + +## 题目描述 +``` +Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water. + +Note: You may not slant the container and n is at least 2. +``` + +![11.container-with-most-water-question](../assets/problems/11.container-with-most-water-question.jpg) +``` + +The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49. + + + +Example: + +Input: [1,8,6,2,5,4,8,3,7] +Output: 49 +``` + +## 思路 +符合直觉的解法是,我们可以对两两进行求解,计算可以承载的水量。 然后不断更新最大值,最后返回最大值即可。 +这种解法,需要两层循环,时间复杂度是O(n^2) + +eg: + +```js + // 这个解法比较暴力,效率比较低 + // 时间复杂度是O(n^2) + let max = 0; + for(let i = 0; i < height.length; i++) { + for(let j = i + 1; j < height.length; j++) { + const currentArea = Math.abs(i - j) * Math.min(height[i], height[j]); + if (currentArea > max) { + max = currentArea; + } + } + } + return max; + +``` + +> 这种符合直觉的解法有点像冒泡排序, 大家可以稍微类比一下 + +那么有没有更加优的解法呢?我们来换个角度来思考这个问题,上述的解法是通过两两组合,这无疑是完备的, +那我门是否可以先计算长度为n的面积,然后计算长度为n-1的面积,... 计算长度为1的面积。 这样去不断更新最大值呢? +很显然这种解法也是完备的,但是似乎时间复杂度还是O(n ^ 2), 不要着急。 + +考虑一下,如果我们计算n-1长度的面积的时候,是直接直接排除一半的结果的。 + +如图: + +![11.container-with-most-water](../assets/problems/11.container-with-most-water.png) + + +比如我们计算n面积的时候,假如左侧的线段高度比右侧的高度低,那么我们通过左移右指针来将长度缩短为n-1的做法是没有意义的, +因为`新的形成的面积变成了(n-1) * heightOfLeft 这个面积一定比刚才的长度为n的面积nn * heightOfLeft 小` + +也就是说最大面积`一定是当前的面积或者通过移动短的线段得到`。 +## 关键点解析 + +- 双指针优化时间复杂度 + + +## 代码 + +```js +/* + * @lc app=leetcode id=11 lang=javascript + * + * [11] Container With Most Water + * + * https://leetcode.com/problems/container-with-most-water/description/ + * + * algorithms + * Medium (42.86%) + * Total Accepted: 344.3K + * Total Submissions: 790.1K + * Testcase Example: '[1,8,6,2,5,4,8,3,7]' + * + * Given n non-negative integers a1, a2, ..., an , where each represents a + * point at coordinate (i, ai). n vertical lines are drawn such that the two + * endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together + * with x-axis forms a container, such that the container contains the most + * water. + * + * Note: You may not slant the container and n is at least 2. + * + * + * + * + * + * The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In + * this case, the max area of water (blue section) the container can contain is + * 49. + * + * + * + * Example: + * + * + * Input: [1,8,6,2,5,4,8,3,7] + * Output: 49 + * + */ +/** + * @param {number[]} height + * @return {number} + */ +var maxArea = function(height) { + if (!height || height.length <= 1) return 0; + + // 双指针来进行优化 + // 时间复杂度是O(n) + let leftPos = 0; + let rightPos = height.length - 1; + let max = 0; + while(leftPos < rightPos) { + + const currentArea = Math.abs(leftPos - rightPos) * Math.min(height[leftPos] , height[rightPos]); + if (currentArea > max) { + max = currentArea; + } + // 更新小的 + if (height[leftPos] < height[rightPos]) { + leftPos++; + } else { // 如果相等就随便了 + rightPos--; + } + } + + return max; +}; +``` + diff --git a/problems/875.koko-eating-bananas.md b/problems/875.koko-eating-bananas.md new file mode 100644 index 0000000..197effc --- /dev/null +++ b/problems/875.koko-eating-bananas.md @@ -0,0 +1,155 @@ +## 题目地址 +https://leetcode.com/problems/koko-eating-bananas/description/ + +## 题目描述 +``` +Koko loves to eat bananas. There are N piles of bananas, the i-th pile has piles[i] bananas. The guards have gone and will come back in H hours. + +Koko can decide her bananas-per-hour eating speed of K. Each hour, she chooses some pile of bananas, and eats K bananas from that pile. If the pile has less than K bananas, she eats all of them instead, and won't eat any more bananas during this hour. + +Koko likes to eat slowly, but still wants to finish eating all the bananas before the guards come back. + +Return the minimum integer K such that she can eat all the bananas within H hours. + + + +Example 1: + +Input: piles = [3,6,7,11], H = 8 +Output: 4 +Example 2: + +Input: piles = [30,11,23,4,20], H = 5 +Output: 30 +Example 3: + +Input: piles = [30,11,23,4,20], H = 6 +Output: 23 + + +Note: + +1 <= piles.length <= 10^4 +piles.length <= H <= 10^9 +1 <= piles[i] <= 10^9 + +``` + +## 思路 +符合直觉的做法是,选择最大的堆的香蕉数,然后试一下能不能行,如果不行则直接返回上次计算的结果, +如果行,我们减少1个香蕉,试试行不行,依次类推。计算出刚好不行的即可。这种解法的时间复杂度是O(n)。 + +这道题如果能看出来是二分法解决,那么其实很简单。为什么它是二分问题呢? +我这里画了个图,我相信你看了就明白了。 + +![koko-eating-bananas](../assets/problems/koko-eating-bananas.png) + +## 关键点解析 + +- 二分查找 + + +## 代码 + +```js +/* + * @lc app=leetcode id=875 lang=javascript + * + * [875] Koko Eating Bananas + * + * https://leetcode.com/problems/koko-eating-bananas/description/ + * + * algorithms + * Medium (44.51%) + * Total Accepted: 11.3K + * Total Submissions: 24.8K + * Testcase Example: '[3,6,7,11]\n8' + * + * Koko loves to eat bananas.  There are N piles of bananas, the i-th pile has + * piles[i] bananas.  The guards have gone and will come back in H hours. + * + * Koko can decide her bananas-per-hour eating speed of K.  Each hour, she + * chooses some pile of bananas, and eats K bananas from that pile.  If the + * pile has less than K bananas, she eats all of them instead, and won't eat + * any more bananas during this hour. + * + * Koko likes to eat slowly, but still wants to finish eating all the bananas + * before the guards come back. + * + * Return the minimum integer K such that she can eat all the bananas within H + * hours. + * + * + * + * + * + * + * + * Example 1: + * + * + * Input: piles = [3,6,7,11], H = 8 + * Output: 4 + * + * + * + * Example 2: + * + * + * Input: piles = [30,11,23,4,20], H = 5 + * Output: 30 + * + * + * + * Example 3: + * + * + * Input: piles = [30,11,23,4,20], H = 6 + * Output: 23 + * + * + * + * + * Note: + * + * + * 1 <= piles.length <= 10^4 + * piles.length <= H <= 10^9 + * 1 <= piles[i] <= 10^9 + * + * + * + * + * + */ + + function canEatAllBananas(piles, H, mid) { + let h = 0; + for(let pile of piles) { + h += Math.ceil(pile / mid); + } + + return h <= H; + } +/** + * @param {number[]} piles + * @param {number} H + * @return {number} + */ +var minEatingSpeed = function(piles, H) { + let lo = 1, + hi = Math.max(...piles); + + while(lo <= hi) { + let mid = lo + ((hi - lo) >> 1); + if (canEatAllBananas(piles, H, mid)) { + hi = mid - 1; + } else { + lo = mid + 1; + } + } + + return lo; // 不能选择hi +}; +``` + -- GitLab