首页 > 编程语言 >Java解决贪心法解决盛水问题

Java解决贪心法解决盛水问题

时间:2024-07-20 13:29:58浏览次数:16  
标签:begin end 盛水 int max height Java 贪心

贪心法定义: 

   贪心算法是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期获得全局最优解贪心法的基本思路是从问题的某一个初始解出发,通过每一步的最优解,逐步逼近给定的目标,以尽可能快地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。

贪心法盛水问题介绍:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

基本思想:

处理方式:

两边向中间遍历,每次移动最短的那一条边,计算盛水量,与最大容积作比较。

为什么要移动最短的那一条边?

只要移动肯定会使其x轴区域减少,如果移动左右两条边中最长的那个边,因为木桶效应容积必然会减少。每次移动最短的那条边就是贪心法中的局部最优解。

Java代码实现:

package 贪心法;

import static java.lang.Math.*;

public class 盛水问题 {
    public static void main(String[] args) {
        //定义每个板子的高度
        int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
        //定义开始索引
        int begin = 0;
        //定义结束索引
        int end = height.length - 1;
        //定义最大盛水量
        int max = 0;
        //定义最大盛水量时左右边板子序号
        int r = 0;
        int l = 0;
        //定义x轴每一个格子宽度
        int wide = 3;
        while (begin != end) {
            //计算盛水量a
            int a = wide * (end - begin) * min(height[begin], height[end]);
            System.out.println("当前盛水量:" + a);
            System.out.println("左边索引:" + begin + "右边索引:" + end);
            //如果成水量a大于当前max,则更新max
            if (a > max) {
                max = a;
                r = end + 1;
                l = begin + 1;
            }
            //移动这两条边中最小的边
            if (height[begin] > min(height[begin], height[end])) {
                end--;
                System.out.println("右边移动一次");
            } else {
                begin++;
                System.out.println("左边移动一次");
            }
        }

        System.out.println("左边板高度:  " + height[begin] + "    左边第" + l + "个板子" +
                "\n右边板高度:  " + height[end] + "  右边第" + r + "个板子"
                + "\n最大盛水量: " + max);
    }
}

 

 

标签:begin,end,盛水,int,max,height,Java,贪心
From: https://blog.csdn.net/Python300/article/details/140569716

相关文章

  • 初学Java2
    在继续学习Java一周后,我发现Java在编码时有些地方与我之前学习过的C语言相同,比如许多函数与标识符大致是一样的,在一些地方的语法相似,这会有助于我对Java的学习。不同的地方也很多,比如很简单的一个地方,C语言对类型后缀有更严格的要求,特别是在整数类型上,必须显式指定long或longlong......
  • 基于Java Springboot餐厅点餐系统
    作者介绍:✌全网粉丝10W+本平台特邀作者、博客专家、CSDN新星计划导师、软件领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于项目实战✌一、作品包含源码+数据库+设计文档万字+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css......
  • 基于Java Springboot宠物管理系统
    作者介绍:✌全网粉丝10W+本平台特邀作者、博客专家、CSDN新星计划导师、软件领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于项目实战✌一、作品包含源码+数据库+设计文档万字+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css......
  • 每天两道Java面试题(九)
    jsp和servlet有什么区别?jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServ......
  • Memcached开发(七):使用Java进行操作
    目录1.安装与配置Memcached1.1安装Memcached1.2配置Memcached2.使用Java与Memcached进行交互2.1安装Java客户端2.2连接Memcached2.3基本操作2.3.1设置键值对2.3.2获取键值对2.3.3删除键值对2.3.4检查键是否存在2.3.5增加和减少数值2.4高级操作2.4.1......
  • Spring Book Club + java查询数据库 + 百万数据 + 同步Elasticsearch(ES)+ 多线程 + Fei
    @FeignClient(name="bwie-elastic")publicinterfaceEsFeign{@PostMapping("/add")publicResultadd(@RequestBodyArrayList<ResourceInfo>resourceInfo);}@RestControllerpublicclassUserControllerimplementsApplica......
  • 图书管理系统(Java--数据库课设)
    1、课程设计要求:实现用户的登陆与注册用户要区分是管理员还是普通用户管理员能够对图书的数量、名称等进行增删改查在书未归还时不可删除用户能够对图书进行查看和借书以及还书,并记录具体时间书数量不足时不能够对书籍进行借用2、代码逻辑以及基础解释        ......
  • Java 中的异常
    异常:就是出现的问题。在Java中异常被当成对象进行处理,所有的异常类都继承于Throwable类,如果Java提供的异常类并不能满足需求,用户还可以自己定义一个异常类。下面是异常体系结构:Throwable又分成了Error和Exception。本文仅讨论Exception及其子类,因为Error出现的话也不是我们......
  • java Selenium,定位 伪元素.UI自动化
    Java中,要获取这个表单字段前面的星号“*”,因为是用的伪元素,无法直接通过常规定位获取字符,需要用到JavascriptExecutor。importorg.openqa.selenium.By;importorg.openqa.selenium.JavascriptExecutor;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.We......
  • 超详细的MySQL基本使用教程(1) 黑马程序员javaweb学习笔记+练习(附带idea新版ui图形化页
    什么是数据库MySQL概述数据模型关系型数据库SQL简介小结DDL-数据库的设计数据库的常见操作选中该语句然后点运行就成功运行了可以直接用图形化界面进行操作跳转到控制台表的常见操作1.创建练习在db01中创建这张表其中comment是鼠标悬停在......