当前位置: 首页 > article >正文

c++算法贪心系列

本篇文章,同大家一起学习贪心算法!!!

 第一题

题目链接

2208. 将数组和减半的最少操作次数 - 力扣(LeetCode)

题目解析

本题重点:最终的数组和要小于原数组和的一半,且求这一操作的最少操作数

代码原理

代码编写

class Solution {

public:

    int halveArray(vector<int>& nums) {

        double sum = 0.0;

        priority_queue<double> heap;//将数据存放进大根堆中的优势:最大的数会在堆顶

        for(auto cur: nums)

        {

            heap.push(cur);

            sum += cur;

        }

        sum /= 2.0;

        int count = 0;

        while(sum > 0)

        {

            double t = heap.top() / 2.0;

            heap.pop();

            sum -= t;

            count++;

            heap.push(t);

        }

        return count;

    }

};

贪心策略

选择数组中最大的元素

第二题

题目链接

179. 最大数 - 力扣(LeetCode)

题目解析

代码原理

代码编写

class Solution {

public:

    string largestNumber(vector<int>& nums) {

        vector<string> str;

        for(auto cur: nums)

        {

            str.push_back(to_string(cur));

        }

        sort(str.begin(), str.end(), [](const string& a, const string& b)

        {

            return a + b > b + a;

        });

        string ret;

        for(auto& s: str)

        {

            ret += s;

        }

        if(ret[0] == '0') return "0";

        return ret;

    }

};

贪心策略

先看数字的最高位,与其他数字的最高位进行比较,大的在前小的在后

注意:一切都以每个数的最高位为比较对象

第三题

题目链接

376. 摆动序列 - 力扣(LeetCode)

题目解析

相信大家对这道题已经不再陌生,因为我们上一次做这题的时候是用动态规划的方法去做的题,当然这次博主依旧为给大家简单解析一下这题

注意:这里的加号表示递增,减号表示递减!!!大体可以参考高中时学过的单调性

代码原理

将一个波分成两段分析,因此就有了left和right,left的状态(是上升还是下降)由后面的i+1的元素决定,right的状态则需要i + 1元素和i元素决定。

由于起点无法判断它的状态因此要长度减1,也因此最后的子序列长度要加1

代码编写

class Solution {

public:

    int wiggleMaxLength(vector<int>& nums) {

        int n = nums.size();

        if(n < 2) return n;

        int ret = 0, left = 0;

        for(int i = 0; i < n - 1; i++)

        {

             int right = nums[i + 1] - nums[i];

             if(right == 0) continue;

             if(right * left <= 0) ret++;

             left = right;

        }

        return ret + 1;

    }

};

贪心策略

画图 + 状态走向

那么本篇文章的内容就先到这里,我们下期文章再见!!!!

记得一键三联哦!!!


http://www.kler.cn/a/515037.html

相关文章:

  • 鸿蒙仓颉环境配置(仓颉SDK下载,仓颉VsCode开发环境配置,仓颉DevEco开发环境配置)
  • Flink底层架构与运行流程
  • STM32学习9---EXIT外部中断(理论)
  • MDX语言的语法糖
  • 基于Redis实现短信验证码登录
  • HTML 表单和输入标签详解
  • 2024.1.22 安全周报
  • 大华Java开发面试题及参考答案 (下)
  • UE5 开启“Python Remote Execution“
  • 解决go.mod文件中replace不生效的问题
  • Mono里运行C#脚本31—mono_arch_create_generic_trampoline
  • YOLOv10-1.1部分代码阅读笔记-predictor.py
  • 【Linux】APT 密钥管理迁移指南:有效解决 apt-key 弃用警告
  • 如何实现亿级用户在线状态统计?
  • .NET MAUI进行UDP通信(二)
  • 吴恩达深度学习——如何实现神经网络
  • 【2024年华为OD机试】 (E卷,100分) - 预订酒店(JavaScriptJava PythonC/C++)
  • Ubuntu20彻底删除MySQL8
  • WPS计算机二级•幻灯片的基础操作
  • Qt调用ffmpeg库实时播放rtmp或rtsp视频流
  • 【玩转全栈】----Django模板的继承
  • 使用Chrome和Selenium实现对Superset等私域网站的截图
  • 【学习笔记】计算机网络(一)
  • Ubuntu20.04 安装 cartographer
  • 深度学习笔记31_ResNet与DenseNet结合探索
  • Java数据结构 (从0构建链表(LinkedList))