zoukankan      html  css  js  c++  java
  • 每日一道:盛最多水的容器

    package main
    
    import "fmt"
    
    /*给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai)
    在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)
    找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
    输入:[1,8,6,2,5,4,8,3,7]
    输出:49
    解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
    */
    
    func main() {
    	fmt.Println(maxArea1([]int{1, 8, 6, 2, 5, 4, 8, 3, 7}))
    }
    
    // 暴力遍历
    func maxArea1(height []int) int {
    	n := len(height)
    	if n <= 1 {
    		return 0
    	}
    	maxMulti := 0
    	for i := 0; i < n-1; i++ {
    		for j := i + 1; j < n; j++ {
    			var h int
    			if height[i] >= height[j] {
    				h = height[j]
    			} else {
    				h = height[i]
    			}
    			w := h * (j - i)
    			if w > maxMulti {
    				maxMulti = w
    			}
    		}
    	}
    	return maxMulti
    }
    /*使用 2 个指针指向首部和尾部,将短指针向长指针方向移动,看能不能找到更长的线,使面积更大
    依据:向长线方向每次移动 1 格,虽然宽度-1,但是(高度变高)*(宽度-1) >= 高度*宽度*/
    func maxArea2(height []int) int {
    	max := 0
    	for i, j := 0, len(height)-1; i < j; {
    		var minHeight int
    		if height[i] <= height[j] {
    			minHeight = height[i]
    			i++
    		} else {
    			minHeight = height[j]
    			j--
    		}
    		w := (j - i + 1) * minHeight
    		if w > max {
    			max = w
    		}
    	}
    	return max
    }
    

      

  • 相关阅读:
    IDEA、Eclipse快捷键对比
    linux常见命令
    拷贝本地文件到远程服务器的批处理脚本
    关系型数据库的超键、候选键、主键
    JAVA运算符总结
    JAVA原码反码补码
    JPA查询语句(转载)
    Spring Data JPA初使用(转载)
    android学习————项目导入常见错误整理(转载)
    Spring 系列: Spring 框架简介
  • 原文地址:https://www.cnblogs.com/csp813/p/15592166.html
Copyright © 2011-2022 走看看