贪心算法(局部最优实现全局最优)第一篇

贪心算法(局部最优实现全局最优)第一篇

目录

1. 什么是贪心算法

2. 贪心算法的解题步骤

3. 具体例题及代码

3.1 LeetCode860. 柠檬水找零

3.2 LeetCode2208. 将数组和减半的最少操作次数

3.3 LeetCode179. 最大数


从这篇文章开始,我们开始讲解贪心算法。

1. 什么是贪心算法

贪心算法是算法设计中的经典思想,核心逻辑用一句话就能概括 ——每一步都做出当前情况下的最优选择,不回头、不纠结,最终期望得到全局最优解。它不像动态规划那样依赖中间状态存储,也不用回溯尝试所有可能,凭借 “直来直往” 的思路,成为解决特定问题的高效方案。

2. 贪心算法的解题步骤

  1. 问题拆解:将复杂问题拆分成多个连续的局部决策步骤。
  2. 确定贪心策略:明确每一步的 “最优标准”(比如 “选最小”“选最大”“选最早结束”)。
  3. 验证可行性:确认该策略能满足 “局部最优推全局最优”,避免无效贪心
  4. 代码实现:通常先排序(按策略对应的规则),再遍历执行贪心选择。

之所以给第三步加粗,是因为这一步在我看来是最重要的。因为有些题目看起来好像可以使用贪心,但是实际上是不可以的,很多时候局部最优达不到全局最优解。

同时在我看来它也没有具体的模版,因为它要根据每一题来设计不同的贪心思路。我觉得贪心最重要的就是经验。

3. 具体例题及代码

3.1 LeetCode860. 柠檬水找零

我们看下面这张图片,要求是模拟实现找零,那么我们的策略就是每一次都尽量给大的零钱,因为这样我们可以确保只会出现零钱不够的情况,不会出现有钱但是无法使用的情况。

所以代码设计也很简单,就是找零能用大的就用大的,就这样设计就好了。在我们一开始对于贪心算法的学习过程中我觉得最重要的就是我们可以想到使用贪心算法。

其实这道题的代码也很好写,就是几个条件判断就好了。

class Solution { public: bool lemonadeChange(vector<int>& bills) { int a=0;//5 int b=0;//10 int c=0;//20 int sz=bills.size(); for(int i=0;i<sz;++i) { int num=bills[i]; if(num==20) { if(b&&a) { b--; a--; c++; } else if(a>3||a==3) { a-=3; c++; } else return false; } if(num==10) { if(a) { a--; b++; } else return false; } if(num==5) a++; } return true; } };

3.2 LeetCode2208. 将数组和减半的最少操作次数

我们看下面这道题,题目要求我们最小次数的对数组里面的数除以2,使数组和小于等于原先数组的一半。其实从题目上我们很好想到,就是每次找数组里面最大的数,然后给它减去一半。

我们看下面这个代码,其实我们只要知道priority_queue就可以很快的做出来这道题,priority_queue是默认大堆的,所以我们在这里就不用更改。同时它每插入一个数都会对其进行排序,所以我们只要不断的取出堆顶的元素就好了。

class Solution { public: int halveArray(vector<int>& nums) { priority_queue<double> p; double a1=0; double a2=0; for(auto& a:nums) { a1+=a; a2+=a; p.push(a); } a1/=2; int mem=0; while(a1<a2) { double tmp=p.top()/2; p.pop(); a2-=tmp; p.push(tmp); mem++; } return mem; } };

3.3 LeetCode179. 最大数

题目的意思就是给我们一个数组,然后我们要用数组里面的数来组成一个最大的数。所以我们根据组合后数字的大小来排序。

我们看代码,因为知道是通过组合后数字的大小来排序,所以我们在这里就直接通过一个lambda 表达式,给sort重写排序规则,就可以做出来这道题了。

class Solution { public: string largestNumber(vector<int>& nums) { vector<string> str; for(auto& s:nums) str.push_back(to_string(s)); sort(str.begin(),str.end(),[](const string& s1,const string&s2){ return s1+s2>s2+s1; }); string tmp; for(auto& s:str) tmp+=s; if(tmp[0]=='0') return "0"; else return tmp; } };

Read more

基于腾讯云HAI + DeepSeek快速设计自己的个人网页

基于腾讯云HAI + DeepSeek快速设计自己的个人网页

前言:通过结合腾讯云HAI 强大的云端运算能力与DeepSeek先进的 AI技术,本文介绍高效、便捷且低成本的设计一个自己的个人网页。你将了解到如何轻松绕过常见的技术阻碍,在腾讯云HAI平台上快速部署DeepSeek模型,仅需简单几步,就能获取一个包含个人简介、技能特长、项目经历及联系方式等核心板块的响应式网页。 目录 一、DeepSeek模型部署在腾讯云HAI 二、设计个人网页 一、DeepSeek模型部署在腾讯云HAI 把 DeepSeek 模型部署于腾讯云 HAI,用户便能避开官网访问限制,直接依托腾讯云 HAI 的超强算力运行 DeepSeek-R1 等模型。这一举措不仅降低了技术门槛,还缩短了部署时间,削减了成本。尤为关键的是,凭借 HAI 平台灵活且可扩展的特性,用户能够依据自身特定需求定制专属解决方案,进而更出色地适配特定业务场景,满足各类技术要求 。 点击访问腾讯云HAI控制台地址: 算力管理 - 高性能应用服务 - 控制台 腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力,只需简单的几步就能调用DeepSeek - R1

By Ne0inhk
AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

云边有个稻草人-ZEEKLOG博客 目录 引言 一、什么是DeepSeek? 1.1 DeepSeek平台概述 1.2 DeepSeek的核心功能与技术 二、蓝耘通义万相2.1概述 2.1 蓝耘科技简介 2.2 蓝耘通义万相2.1的功能与优势 1. 全链条智能化解决方案 2. 强大的数据处理能力 3. 高效的模型训练与优化 4. 自动化推理与部署 5. 行业专用解决方案 三、蓝耘通义万相2.1与DeepSeek的对比分析 3.1 核心区别 3.2 结合使用的优势 四、蓝耘注册流程 五、DeepSeek与蓝耘通义万相2.1的集成应用 5.1 集成应用场景 1. 智能医疗诊断

By Ne0inhk
如何通过 3 个简单步骤在 Windows 上本地运行 DeepSeek

如何通过 3 个简单步骤在 Windows 上本地运行 DeepSeek

它是免费的——社区驱动的人工智能💪。         当 OpenAI 第一次推出定制 GPT 时,我就明白会有越来越多的人为人工智能做出贡献,并且迟早它会完全由社区驱动。         但从来没有想过它会如此接近😂让我们看看如何在 Windows 机器上完全免费使用第一个开源推理模型!  步骤 0:安装 Docker 桌面         我确信很多人已经安装了它,所以可以跳过,但如果没有 — — 这很简单,只需访问Docker 的官方网站,下载并运行安装 👍         如果您需要一些特定的设置,例如使用 WSL,那么有很多指导视频,请查看!我将继续下一步。 步骤 1:安装 CUDA 以获得 GPU 支持         如果您想使用 Nvidia 显卡运行 LLM,则必须安装 CUDA 驱动程序。(嗯……是的,它们需要大量的计算能力)         打开CUDA 下载页面,

By Ne0inhk
在 VSCode 中本地运行 DeepSeek,打造强大的私人 AI

在 VSCode 中本地运行 DeepSeek,打造强大的私人 AI

本文将分步向您展示如何在本地安装和运行 DeepSeek、使用 CodeGPT 对其进行配置以及开始利用 AI 来增强您的软件开发工作流程,所有这些都无需依赖基于云的服务。  步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT         要在本地运行 DeepSeek,我们首先需要安装Ollama,它允许我们在我们的机器上运行 LLM,以及CodeGPT,它是集成这些模型以提供编码辅助的 VSCode 扩展。 安装 Ollama Ollama 是一个轻量级平台,可以轻松运行本地 LLM。 下载Ollama 访问官方网站:https://ollama.com * 下载适合您的操作系统(Windows、macOS 或 Linux)的安装程序。 * 验证安装 安装后,打开终端并运行: ollama --version  如果 Ollama 安装正确,

By Ne0inhk