算法学习——贪心算法

news2024/12/28 21:50:02

目录

一,柠檬水找零

1.题目

2.题目接口

3.题目解题思路

二,将数组减半的最小操作数

 1.题目

2.题目接口

3.解题思路及代码

三,摆动序列

1.题目

2.题目接口

3.解题代码及思路


一,柠檬水找零

1.题目

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

2.题目接口

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

    }
};

3.题目解题思路

首先来看解题代码:

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

        int five = 0;
        int ten = 0;

        for(int i = 0;i<bills.size();i++)
        {
           if(bills[i] == 5)
           {
               five++;
           }

           else if(bills[i] == 10)
           {
               if(five == 0)
               {
                   return false;
               }

               five--;
               ten++;
           }

           else
           {
              if(ten>0)
              {
                 if(five ==0)
                 {
                    return false;
                 }
                 ten--;
                 five--;
              }

              else
              {
                  if(five<3)
                  {
                      return false;
                  }

                  five-=3;
              }
           }
        }

         return true;
    }
};

这道题的解题思路我是这样想的。因为我们的钱数只有三种:5,10,20。首先,20是肯定不能拿来找零的。所以我们便定义两个变量five和ten来表示能拿来找零的five和ten的数量。之后我们便来分类讨论:

1.如果账单中是五美元便直接将five++。这时不用找零。

2.如果账单中出现了十美元这时便要找零,这是就得先检查five的数量是否大于0。若five的数量等于0那就直接返回false。如不是便将five--,ten++。

3.第三种情况便是出现了二十美元,这个时候找零便有两种情况:

1.找一张ten+一张five。

2.找三张five。

这两种情况中应该将第一种情况作为优先选项。倘若两者都不成立便返回false。

循环结束还没有返回便可以返回true,找零成功!!!

二,将数组减半的最小操作数

 1.题目

给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作)

请你返回将 nums 数组和 至少 减少一半的 最少 操作数。

2.题目接口

class Solution {
public:
    int halveArray(vector<int>& nums) {
        
    }
};

3.解题思路及代码

先来看解题代码:

class Solution {
public:
    int halveArray(vector<int>& nums) {
        double half = 0;
        double total = 0;
        int count = 0;
        priority_queue<double> heap;

        for(int i = 0;i<nums.size();i++)
        {
           heap.push(nums[i]);
           total+=nums[i];
        }

        total = total/2;
        cout<<heap.top()<<endl;


        for(int i = 0;i<nums.size();i++)
        {
            double top = heap.top();
            heap.pop();
            half+= top/2;
            count++;
            heap.push(top/2);

            if(half>=total)
            {
                break;
            }

        }

        return count;
    };
};

要解决这个问题,我们用的思路便是找到这个数组中的最大值然后将这个最大值砍半。那我们该怎么找呢?这里便要用到一个数据结构叫做优先级队列,优先级队列的top()便是它的最大值。解决步骤如下:

1.将nums数组里的数据push到优先级队列中。并求出nums中元素的和total。

2.将total砍半,利用优先级队列将最大值top求出,并将top砍半,用half记录。并将操作数count++。

3.将heap原来的top删除掉并将砍半后的top插入到heap中。

4.如果half>=total便可以break,然后返回count。

三,摆动序列

1.题目

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

  • 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。

  • 相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。

给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。

2.题目接口

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {

    }
};

3.解题代码及思路

解题代码:

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
          int count = 0;
          int left = 0,right = 0;
          
          if(nums.size()<2)
          {
              return 1;
          }
          

          for(int i = 0;i<nums.size()-1;i++)
          {
             int right = nums[i+1]-nums[i];

             if(right == 0)//遇到相同大小的数据便跳过。
             {
                 continue;
             }

             if(right*left<=0)//当找到波峰或者波谷时便统计。
             {
                 count++;
             }

             left = right;//交换两边的单调性。
          }

         

          return count+1;//加上不能统计到的最右边的数。
    }
};

解题思路:

这道题的最佳解题思路其实就是找到这个数组的折线图的波峰与波谷,然后将这些波峰和波谷的数量统计下来便得到了最优解。

那我们该如何统计波峰和波谷呢?首先我们要知道的是在折线统计图中,波峰和波谷的两边的单调性是不一样的,所以可以利用这个性质来统计波峰和波谷。

步骤:

1.设计两个值:left,right。这两个值分别来统计一个值两边的单调性。

2.当这两个值的乘积为负数或者0时便将cout++。为什么乘积为0时还可以加加呢?

这是因为存在这样两种情况:

1.数组的数据为[1,2,2,2,2,1]时,折线图为:

这是我们的摆动序列便是:[1,2,1]。在这里指挥计算最后一个2因为这条语句:

 if(right == 0) continue;
             

对于最后一个2来说,right*left == 0。

还有一种情况,比如当数组的数据为:[2,1,1,1,1,2]时。折线图如下:

摆动序列便是[2,1,2]。也是只会统计最后一个1,它的right*left == 0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux文件系统 struct file 结构体解析

文章目录 一、open系统调用1.1 简介1.2 files_struct1.2.1 简介1.2.2 init_files1.2.2 CLONE_FILES 1.3 源码分析1.3.1 get_unused_fd_flags1.3.2 do_filp_open1.3.3 fd_install 二、struct file简介三、其他参考资料 一、open系统调用 1.1 简介 NAMEopen, creat - open and …

手撸java对象拷贝工具类(赶快来试试)

今天心血来潮想自己手撸一个对象拷贝工具学习学习&#xff0c;感觉很不错&#xff0c;使用纯原生java&#xff0c;不依赖任何工具类&#xff0c;健壮性就不优化了。技术主要用到了反射和stream&#xff0c;赶快来试试&#xff0c;炒鸡好用&#xff01; /*** 对象拷贝注入* 参数…

加权平均、EMD、小波等方法去噪效果对比

加权平均、EMD、小波等方法去噪效果对比 代码 整体代码如下 %% clear all; clc;load(data_filter120Hz.mat); %可自己生成随机噪声 fs1000;%采样频率是1000Hz %% %生成正弦波信号 tlinspace(0, length(data)/fs-1/fs, length(data)); y1 15*sin(2*pi* 2.8 *t);%生成频率为2.…

如何选择一款适合的工单管理系统?“的修”工单系统有什么优势?

在如今快节奏的单位环境中&#xff0c;一个高效、便捷的工单管理系统对于单位的重要性不言而喻。面对琳琅满目的工单管理系统&#xff0c;单位该如何选择最合适的一款呢&#xff1f;本文将详细评测“的修”工单管理系统&#xff0c;带您了解它的强大功能和优势&#xff0c;帮您…

游戏缺少dll文件用什么修复?dll多种修复方法指南

在玩游戏时&#xff0c;有时候可能会遇到游戏缺少dll文件的问题。dll文件是动态链接库的缩写&#xff0c;它包含了一些函数和资源&#xff0c;游戏运行需要依赖这些文件。如果缺少了某个dll文件&#xff0c;游戏就可能无法正常运行。那么游戏缺少dll文件用什么修复&#xff1f;…

C语言---预处理详解

1.预定义符号 在C语言中有一些内置的预定义符号 __FILE__ __LINE__ __DATE__ __TIME__ __STDC__//进行编译的源文件 //文件当前的行号 //文件被编译的日期 //文件被编译的时间 //如果编译器遵循ANSI C&#xff0c;其值为1&#xff0c;否则未定义 编译器在__STDC__报错,说明,v…

基于IPSec VPN隧道技术的国密加密网关保障电力工控数据安全

IPSec VPN&#xff08;Internet Protocol Security Virtual Private Network&#xff09;隧道技术为电力工控系统提供了重要的数据安全传输手段。该技术能实现身份鉴别和数据加密传输&#xff0c;为系统的防护工作增添了有力的支持。 电力工控系统对数据传输的可靠性要求较高。…

String的intern()方法详解

文章目录 前言一、new String&#xff08;&#xff09;创建了几个对象&#xff1f;二、Stting anew String("ab")new String("c")创建了几个对象三、String的intern()方法四&#xff1a;面试题五&#xff1a;总结 前言 在开发过程中很多朋友&#xff0c;由…

vue.config.js配置proxy代理产生404错误的原因

在使用vue做开发时&#xff0c;请求api接口时为了解决跨域问题&#xff0c;一般会设置proxy代理&#xff0c; 但有时候会莫名其妙的出现404错误&#xff0c;这里总结一下vue设置proxy代理产生404错误的几种原因&#xff1a; 原因1&#xff1a;没有注意vue proxy代理优先级的规…

SQL Server向表中插入数据

SQL Server向表中插入数据 切换到对应的数据库 use DBTEST插入数据 方式1 insert into 表名&#xff08;列名1,列名2) values&#xff08;数据1&#xff0c;数据2&#xff09;注意&#xff1a; 列名就算是字符类型也不用加引号&#xff0c;数据如果对应的字段是字符串类型&…

48.排列问题求解

思路分析&#xff1a;通过为每一队分配一个id&#xff0c;join条件要求t1.num < t2.num实现相同两队只比一次 代码实现&#xff1a; with t as (SELECT team_name,caseteam_nameWHEN 勇士 then 1WHEN 湖人 then 2WHEN 灰熊 then 3else 4end numFROM team )SELECT t1.team_…

零经验想跳槽转行网络安全,需要准备什么?

最近在后台看到很多私信都是有关转行网络安全的问题&#xff0c;目前咨询最多的都是&#xff1a;觉得现在的工作没有发展空间&#xff0c;替代性强&#xff0c;工资低&#xff0c;想跳槽转行网络安全。其中&#xff0c;他们主要关心的是&#xff1a;没有经验怎么学习&#xff1…

模糊测试面面观 | 电动汽车充电桩安全漏洞案例分享

在上一期我们讲了针对车载以太网DOIP协议详细阐释在实际过程的漏洞发掘过程&#xff0c;本期我们将继续延展&#xff0c;探讨电动车充电系统的安全漏洞。开源网安在基于 GB/T 27930-2015通信标准的电动汽车充电桩中&#xff0c;采用渗透测试、模糊测试和数据流分析等多种安全漏…

易天光通信推出100G BIDI ER光模块最新解决方案

随着数字信息时代的快速发展&#xff0c;网络通信技术的迅猛进步成为推动科技创新和产业升级的重要引擎之一。作为光通信行业的新秀&#xff0c;近期易天光通信推出了全新的100G BIDI ER1 Lite光模块和100G BIDI LR1 Lite光模块&#xff0c;助力崭新的未来网络建设。 易天光通…

45.复购率问题求解

思路分析&#xff1a; &#xff08;1&#xff09;近xx天&#xff0c;最大日期肯定就是最新的一天&#xff0c;故先用max(order_date) over() today计算当天日期 &#xff08;2&#xff09;过滤出最近90天的订单并且按照user_id,product_id分组求购买次数&#xff1b; &#xff…

逐字稿 | 视频理解论文串讲(上)【论文精读】

大家好&#xff0c;前两期我们讲了视频理解领域里的两篇经典的论文&#xff0c;一个是双流网络&#xff0c;第一个是 I3D 网络&#xff0c;所以说对视频理解这个问题有了个基本的了解。 那今天我们就从 2014 年开始&#xff0c;一直到最近 2021 年的工作&#xff0c;我们一起来…

攻防世界题目练习——Web引导模式(三)(持续更新)

题目目录 1. mfw2.3.4.5. 1. mfw 进去看到网页和页面内容如下&#xff1a; 看到url的参数 ?pageabout &#xff0c;我以为是文件包含什么的&#xff0c;反复试了几次&#xff0c;想用 …/…/…/…/etc/passwd &#xff0c;但是发现.似乎被过滤了&#xff0c;实在不知道怎么做…

转行学网络安全,月薪6k到30k,给兄弟们一些个人建议

前言&#xff1a; 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然或恶意原因而遭受破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 截至2018年8月&#xff0c;我国网民规模达8.02亿人&#xff0c;互联网高…

PHP 生成微信小程序码,并存储图片

背景 当前鄙人接手的项目&#xff0c;需要在设备机器上展示 小程序二维码 为了记录扫码用户从哪台机器注册的 那么&#xff0c;实现方案就是&#xff1a;在小程序码中&#xff0c;绑定设备编号参数 在此&#xff0c;记录一番实现步骤 … 小程序开发文档 - 【 获取不限制的小程…

数据结构-----红黑树简介

目录 前言 1.什么是红黑树&#xff1f; 2.为什么需要红黑树&#xff1f;&#xff08;与AVL树对比&#xff09; 3.红黑树的特性 前言 在此之前我们学习过了二叉排序树和平衡二叉树&#xff08;AVL树&#xff09;&#xff0c;这两种树都是属于搜索树的一种&#xff0c;那么今天…