[路飞]~ 假期快乐算法题

142 阅读1分钟

11. 盛最多水的容器

题目细节可自行点进去了解,大概意思就是给了一组素组为容器的高度,选取数组中两个元素作为高度,下标差作为宽度组成一个最大面积的容器
示例如下图

盛最多水的容器.001.jpeg 我的解法,采用双指针,对下标两边高度进行比对,小的就进行移动,每次计算面积并记录,具体流程可看如下动图

盛最多水的容器.gif 在指针变动时,需要注意,高度总是要选取两个高度中小的那个,这样水才不会溢出

var maxArea = function(height) {
    let left = 0, right = height.length-1, maxArea = 0;
    while(left < right){
        // 计算面积
        let area = Math.min(height[left],height[right]) * (right-left)
        //记录最大面积
        maxArea = Math.max(maxArea,area)
        //根据height高度移动指针
        if(height[left] > height[right]){
            right--
        }else{
            left++
        }
    }
    return maxArea
};

// 这里多(right-left) 表示的是宽度哈

将一维数组转变成二维数组

给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和  n 。你需要使用 original 中 所有 元素创建一个 m 行 n 列的二维数组。 original 中下标从 0 到 n - 1 (都 包含 )的元素构成二维数组的第一行,下标从 n 到 2 * n - 1 (都 包含 )的元素构成二维数组的第二行,依此类推。

这题没有啥技巧,暴力解就完事了,为什么贴在这呢,是因为过节能有简单题刷,心情确实有被好到

var construct2DArray = function(original, m, n) {
    // 因为original中给的元素不够分配返回空数组
    if(original.length !== m *n){
        return []
    }
    // 构建以m为长度的二维数组
    let arr = new Array(m).fill(0).map(() => new Array(n).fill(0)),idx=0
    // 双重循环遍历搞定
    for(let i = 0; i < arr.length; i++){
        for(let j = 0 ; j < arr[i].length; j++){
             arr[i][j] = original[idx++]
        }
    }
    return arr
};