栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

贪心算法学习记录(2)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

贪心算法学习记录(2)

例题 3.盛最多水的容器

11. 盛最多水的容器 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/container-with-most-water/         目标:输入隔板高度,输出最大水箱容量及选取的隔板坐标。

        思路:让左右距离尽可能大、短板尽可能高。当某侧为短板时,向内寻找下一块隔板,此时左右距离一定会变小,但是短板高度可能会变高,因此有可能产生更优解。比较新水箱的容量和旧水箱的容量,保留最大值及所选的隔板,以此类推。

        解法:采用双指针解题,i指向开始隔板位置,j指向结束隔板位置,i从左到右遍历,j从右到左遍历。

# 输入n个非负整数,每个整数代表一个点(i,a(i))
# 每个点到x轴的距离为隔板的高,两个隔板可以形成一个水箱
# 选出两个隔板,使形成的水箱容量最大


bad_input = False
while True:
    try:
        box_list = list(map(int,input('请输入至少2个非负整数:').split()))
        if len(box_list) < 2:
            print('输入数字小于2个,请重新输入!')
            continue
        for i in box_list:
            if i < 0:
                print('存在负数,请重新输入!')
                bad_input = True
                break
        if bad_input:
            continue
        else:
            break
    except ValueError:
        print('请重新输入符合标准的数字!')
print(box_list)
i,j,res = 0,len(box_list)-1,[0,0,0]
while i < j :
    if box_list[i] < box_list[j]:
        if res[0] < box_list[i]*(j-i):
            res = [box_list[i] * (j - i),i,j]
        i += 1
    else:
        if res[0] < box_list[j] * (j - i):
            res= [box_list[j] * (j - i),i,j]
        j -= 1
print('水箱最大容量为{},选取的隔板坐标为{}和{}'.format(res[0],res[1],res[2]))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666754.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号