LeetCode Day 4

空扰寡人 提交于 2020-01-07 12:05:27

LeetCode0011

  • 给定 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;
};

LeetCode0008

  • 请你来实现一个 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);
};
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!