- 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。n 的值至少为 2。
- 图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
- 示例:
- 输入: [1,8,6,2,5,4,8,3,7]
- 输出: 49
思路:
- 我们最喜闻乐见的暴力法,对每个元素都计算一下他跟其他元素能形成的最大面积即可,时间复杂度O(n^2^),当然,这么玩就没意思了。
- 我们假定有两块挡板,最早的时候左挡板在最左边,右挡板在最右边,这样子距离是最大的,最大面积就由那块短板决定。
- 接下来我们不管移动左边的挡板或者右边的挡板,两块板之间的距离都会变小,那么唯有下一块挡板高度更高时,才有可能装更多的水。因此哪块挡板更小,我们就先移动哪块,以此为标准来移动左挡板或者右挡板,以便试探容器的最大值。
/** * @param {number[]} height * @return {number} */ var maxArea = function (height) { let left = 0, right = height.length - 1; let maxArea = 0; while (left < right) { maxArea = Math.max(maxArea, Math.min(height[left], height[right]) * (right - left)); if (height[left] < height[right]) { left++; } else { right--; } } return maxArea; };
- 请你来实现一个 atoi 函数,使其能将字符串转换成整数。
- 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
- 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
- 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
- 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
- 在任何情况下,若函数不能进行有效的转换时,请返回 0。
- 假定我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31^, 2^31^ − 1]。如果数值超过这个范围,请返回 INT_MAX (2^31^ − 1) 或 INT_MIN (−2^31^) 。
/** * @param {string} str * @return {number} */ var myAtoi = function (str) { let min = Math.pow(-2, 31); let max = Math.pow(2, 31) - 1 let maxPre = Number.parseInt(max / 10); let negative = false;//结果为正数还是负数 let regx = /[0-9]/; let result = 0; let startWithNumOrSign = false;//是否已经遇到过数字或者符号,如果true再遇到符号或者字母就直接输出result for (let i = 0, lens = str.length; i < lens; i++) { if (str[i] === '-') { if (startWithNumOrSign) return result * (negative ? -1 : 1); negative = true; startWithNumOrSign = true; } else if (str[i] === '+') { if (startWithNumOrSign) return result * (negative ? -1 : 1); negative === false; startWithNumOrSign = true; } else if (regx.test(str[i])) { let num = Number.parseInt(str[i]); startWithNumOrSign = true; if (result > maxPre) { return negative ? min : max; } else if (result === maxPre) { if (negative) { if (num > 8) return min; } else { if (num > 7) return max; } } result = result * 10 + num; } else if (str[i] === ' ') { if (startWithNumOrSign) return result * (negative ? -1 : 1); } else { if (!startWithNumOrSign) { return 0; } else { return result * (negative ? -1 : 1); } } } return result * (negative ? -1 : 1); };
来源:https://www.cnblogs.com/zenronphy/p/12159464.html