【算法】贪心算法练习一

这篇具有很好参考价值的文章主要介绍了【算法】贪心算法练习一。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页 : zxctscl
如有转载请先通知

1. 贪心算法的介绍

一、贪心策略:解决问题的策略,局部最优->全局最优

  1. 把解决问题的过程分为若干步;
  2. 解决每一步的时候,都选择当前看起来“最优的”解法;
  3. 希望得到全局最优。

二、贪心策略的正确性
因为有可能“贪心策略”是一个错误的方法
正确的贪心策略,是需要证明的

常见的证明方法就是在数学中见过的所有证明方法。

三、学习贪心算法的方向
遇到不会的贪心题,很正常,把心态放平。

  1. 前期学习的时候,把重点放在贪心的策略上,把这个策略当做经验吸收。
  2. 如何证明贪心策略是正确的

2. 860. 柠檬水找零

【算法】贪心算法练习一,算法,贪心算法,算法

2.1 分析

一、题目解析
题目已经提到:一开始你手头没有任何零钱,如果第一个顾客给的钱超过了5美元,那么就没有零钱找,就返回false。
考虑当前的顾客时候,是不考虑后面的顾客。

二、算法原理
分情况讨论:第一种:当顾客给了5美元,就直接收下;
第二种,当顾客给了10美元,先判断一下有没有5美元,有就收下,没有就返回false;
第三种:20美元的找零,可以分一张10和一张5;还可以找三种5块钱,有分歧的时候就得判断一下哪一个找零更好,是10+5,还是5+5+5,所以对于5块钱的作用很大的时候,就把5块钱保留。

【算法】贪心算法练习一,算法,贪心算法,算法

2.2 代码

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {

        int five=0,ten=0;
        for(auto x: bills)
        {
            if(x==5) five++;
            else if(x==10)
            {
                if(five==0) return false;
                five--;ten++;
            }
            else
            {
                if(ten&&five)
                {
                    ten--;five--;
                }
                else if(five>=3)
                {
                    five-=3;
                }
                else return false;
            }
        }
        return true;

    }
};

3. 2208. 将数组和减半的最少操作次数

【算法】贪心算法练习一,算法,贪心算法,算法

3.1 分析

一、题目解析
题目要求返回将 nums 数组和至少减少一半的最少操作数,看一下例1:
【算法】贪心算法练习一,算法,贪心算法,算法
数组和是33,一半就是16.5,先选择19减半就是9.5,此时数组和没有小于16.5;然后继续选择9.5减半为4.75,此时数组和没有小于16.5;再选择8减半为4,此时此时数组和小于16.5,总共就三次减半。

二、算法原理
每次挑选当前数组中,最大的那个数,然后减半,最大的数减半,才有可能最快减到数组和减少到至少一半。
为了选择最大的数,遍历一遍数组的时间复杂度太高了,所以就用一个大根堆,每次堆顶的元素就是最大的数。

【算法】贪心算法练习一,算法,贪心算法,算法

3.2 代码

class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> heap;
        double sum=0;
        for(auto x:nums)
        {
            heap.push(x);
            sum+=x;
        }
        sum/=2.0;

        int count=0;
        while(sum>0)
        {
            double t=heap.top()/2;
            heap.pop();
            sum-=t;
            count++;
            heap.push(t);

        }
        return count;
    }
};

4. 179. 最大数

【算法】贪心算法练习一,算法,贪心算法,算法

4.1 分析

一、题目解析
题目已经提到:
要得到最大的拼接数,就得先把这些数先拼接起来,然后比较找到最大的那一个就行。

二、算法原理
这里就得排序,确定元素的先后顺序:谁在前,谁在后
给这个数组排序,比如[a,b]:如果ab>ba,那么a前,b后;如果ab=ba,那么顺序无所谓;如果ab<ba,那么b前,a后。
比较数的拼接大小比较麻烦,可以把数转换为字符串,然后拼接字符串,比较字典序。
如果传[0,0],那么就会出现前导0的情况,所以在最后的结果中,就直接返回0。
【算法】贪心算法练习一,算法,贪心算法,算法

4.2 代码

class Solution {
public:
    string largestNumber(vector<int>& nums) {
       vector<string> strs;
       for(int x:nums)strs.push_back(to_string(x));

       sort(strs.begin(),strs.end(),[](const string& s1,const string& s2)
       {
        return s1+s2>s2+s1;
       });

       string ret;
       for(auto& s:strs)
       {
        ret+=s;
       }
       if(ret[0]=='0')return "0";
       return ret;
    }
};

有问题请指出,大家一起进步!!!文章来源地址https://www.toymoban.com/news/detail-857609.html

到了这里,关于【算法】贪心算法练习一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【贪心】个人练习-Leetcode-2195. Append K Integers With Minimal Sum

    题目链接:https://leetcode.cn/problems/append-k-integers-with-minimal-sum/ 题目大意:给出一个数组 nums[] ,现在要往里面追加 k 个【互不相同】且【未出现在 nums[] 中】的【正整数】,使得这 k 个数字之和最小。 思路:明显就是贪心,从 1 开始塞进去即可。但是单纯的【累加+用set判断是

    2024年02月02日
    浏览(37)
  • 贪心算法问题实验:贪心算法解决TSP问题

    TSP问题是指旅行商问题,即给定一组城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP困难问题,在运筹学和理论计算机科学中有着广泛的应用。 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最

    2024年02月03日
    浏览(31)
  • 算法竞赛备赛之贪心算法训练提升,贪心算法基础掌握

    905.区间选点 给定N个闭区间[ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量,位于区间端点上的点也算作是区间内。 将每个按区间的右端点从小到大排序 从前往后依次枚举每个区间 如果当前区间中已经包含点,则直

    2024年02月08日
    浏览(28)
  • 初级算法-贪心算法

    主要记录算法和数据结构学习笔记,新的一年更上一层楼! 贪心算法 本质找到每个阶段的局部最优,从而推导全局最优 1. 题目 :假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让

    2024年02月03日
    浏览(22)
  • 算法小课堂(五)贪心算法

    贪心算法是一种常见的算法思想,用于解决优化问题。其基本思想是在每一步选择中都采取当前状态下最优的选择,从而希望能够获得全局最优解。 具体来说,贪心算法通常分为以下步骤: 定义问题的最优解,通常需要将问题转化为求最大值或最小值; 选择一个局部最优解

    2024年02月02日
    浏览(31)
  • 贪心算法part01 算法

    ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和 https://leetcode.cn/problems/assign-cookies/description/ https://leetcode.cn/problems/wiggle-subsequence/description/ https://leetcode.cn/problems/maximum-subarray/description/

    2024年02月02日
    浏览(34)
  • C++算法之贪心算法

    贪心算法是一种求解最优解问题的算法,它的核心思想是每一步都采取当前状态下最优的选择,从而最终得到全局最优解。它是C++重要的一种算法。下面会介绍贪心算法。 目录 1.步骤 1.2 例 2.框架 3.例题 3.1 删数问题 13  3.2 接水问题 (1)确定问题的最优子结构:问题的最优

    2024年01月21日
    浏览(32)
  • 【基础算法】贪心算法

    贪心算法又称贪婪算法,是一种常见的算法思想。贪心算法的优点是效率高,实现较为简单,缺点是可能得不到最优解。 贪心算法就是在求解问题时,总是做出当前看来最好的选择。也就是说贪心算法并不从整体最优上考虑问题,算法得到的是局部最优解。而局部最优解叠加

    2024年02月12日
    浏览(30)
  • 算法设计方法之贪心算法

    贪心算法是算法设计的一种方法。期盼通过每个阶段的局部最优选择,从而达到全局的最优。但结果不一定是最优的。 场景一 零钱兑换 现有硬币 1 元、2 元、5 元,需要用最少的硬币数量凑够 11 元。 利用贪心算法实现,优先考虑最好的结果就是面值为 5 元的硬币,11 = 5 +

    2024年02月17日
    浏览(36)
  • 贪心算法part03算法

    ● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果 https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/ https://leetcode.cn/problems/gas-station/description/ https://leetcode.cn/problems/candy/description/

    2024年01月18日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包