首页 > 编程语言 >学一下贪心算法-学一下贪心算法

学一下贪心算法-学一下贪心算法

时间:2024-03-08 15:46:11浏览次数:18  
标签:一下 heights 算法 砖块 最优 梯子 贪心

贪心算法思想

在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。

特征

1、贪心选择性质

  一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解 。

2、最优子结构性质

  当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心法求解的关键所在。在实际应用中,至于什么问题具有什么样的贪心选择性质是不确定的,需要具体问题具体分析 。

存在问题

贪心算法也存在如下问题:

  1. 不能保证解是最佳的。因为贪心算法总是从局部出发,并没从整体考虑
  2. 贪心算法一般用来解决求最大或最小解
  3. 贪心算法只能确定某些问题的可行性范围

用例

LeetCode - 1642 可以到达的最远建筑


给你一个整数数组 heights ,表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。

你从建筑物 0 开始旅程,不断向后面的建筑物移动,期间可能会用到砖块或梯子。

当从建筑物 i 移动到建筑物 i+1(下标 从 0 开始 )时:

如果当前建筑物的高度 大于或等于 下一建筑物的高度,则不需要梯子或砖块
如果当前建筑的高度 小于 下一个建筑的高度,您可以使用 一架梯子 或 (h[i+1] - h[i]) 个砖块
如果以最佳方式使用给定的梯子和砖块,返回你可以到达的最远建筑物的下标(下标 从 0 开始 )。
 

利用贪心算法

因为梯子可以跨越任意高度,所以优先使用砖块,砖块不够了再使用梯子。

class Solution {
    public int furthestBuilding(int[] heights, int bricks, int ladders) {
        int i = 0;
        while (i < heights.length - 1) {
            if (heights[i] >= heights[i + 1]) {
                i++;
                continue;
            }
            int sp = heights[i + 1] - heights[i];
            if (bricks >= sp) {
                bricks -= sp;
                i++;
                continue;
            }
            if (ladders > 0) {
                ladders--;
                i++;
                continue;
            }
            break;
        }
        return i;
    }
}

只做到局部最优解,对于本道题,用例如
[2,7,8,9,10,11]
5
1
不能通过,因为2-7差值最大,原理上应该使用梯子就可以,后面差值小的才使用砖块。

进一步优化

loading....

标签:一下,heights,算法,砖块,最优,梯子,贪心
From: https://www.cnblogs.com/xiaobaibuai/p/18061118

相关文章

  • php+java加密对接算法
    本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/322请求示例:{"appKey":"demo","nonce":"12345","sign":"04a8ba0a19ffc491716131a542729a9c250d84ce4211889a15f920ce974cf23......
  • 代码随想录算法训练营第四十天 | 96.不同的二叉搜索树,343. 整数拆分
    343.整数拆分 已解答中等 相关标签相关企业 提示 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k>=2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。 示例1:输入:n=2输出:1解释:2=1+1,1×1=1。......
  • day58 动态规划part15 代码随想录算法训练营 392. 判断子序列
    题目:392.判断子序列我的感悟:理解难点:听课笔记:我的代码:通过截图:代码易错点:老师代码:扩展写法-双指针:classSolution:defisSubsequence(self,s:str,t:str)->bool:#初始化两个指针,分别指向s和t的第一个字符i,j=0,0#......
  • 文心一言 VS 讯飞星火 VS chatgpt (210)-- 算法导论16.1 1题
    一、根据递归式(16.2)为活动选择问题设计一个动态规划算法。算法应该按前文定义计算最大兼容活动集的大小c[i,j]并生成最大集本身。假定输入的活动已按公式(16.1)排好序。比较你的算法和GREEDY-ACTIVITY-SELECTOR的运行时间。如何要写代码,请用go语言。文心一言:活动选择问题是一......
  • 算法面试通关40讲
    三分学七分练数组、链表leetcode21site#include<iostream>usingnamespacestd;structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}ListNode(intx):val(x),next(nullptr){}ListNode(intx,ListNode*next)......
  • A星算法笔记
    A星算法笔记参考:https://blog.csdn.net/hitwhylz/article/details/23089415原理heuristic启发式F=G+HG:distancebetweenstartandcurrentnodeH:distancebetweengoalandcurrentnode//TOSEARCH&CHECKManhatan距离:基本数据结构1.全局数组:openlistclose......
  • chapter7-贪心策略-区间贪心
    2.区间贪心区间贪心也是一种常见的贪心策略类的题型。它是指当有多个不同的区间存在,且这些区间有可能相互重叠的时候,如何选择才能从众多区间中,选取最多的两两互不相交的区间。今年暑假不AC杭电OJ2037看尽可能多的节目:贪心策略问题分析:区间贪心和简单贪心不同的地方在于决......
  • 2024牛客寒假算法基础集训营3
    A-智乃与瞩目狸猫、幸运水母、月宫龙虾#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingi128=__int128;usingldb=longdouble;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;usingv......
  • 类以撒的结合的房间生成算法
    类以撒的结合的房间生成算法原链接翻译版本目前本人只实现了房间大小都一样的情况,没有什么2x2,L型,2x1之类的房间放个效果图算法需要注意的房间选择对于当前位置是否有设置房间(是否被占位)当前房间位置是否越界(超出限定范围)当前位置的周围4方向的房间量是否大于1个(为什......
  • 说说Vue 3.0中Treeshaking特性?举例说明一下?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一、是什么Treeshaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Deadcodeelimination简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码如果把代码打包比作制作蛋糕,传统......