《算法题讲解指南:优选算法-分治-快排》--43.颜色分类,44.排序数组

《算法题讲解指南:优选算法-分治-快排》--43.颜色分类,44.排序数组

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--优选算法

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

43.颜色分类

题目链接:

题目描述:

题目示例:

解法(快排思想——三指针法使数组分三块):

算法思路:

C++算法代码:

算法总结及流程解析:

44.排序数组

题目链接:

题目描述:

题目示例:

解法(数组分三块思想+随机选择基准元素的快速排序):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


43.颜色分类

题目链接:

75. 颜色分类 - 力扣(LeetCode)

题目描述:

题目示例:

解法(快排思想——三指针法使数组分三块):

算法思路:

      类比数组分两块的算法思想,这里是将数组分成三块,那么我们可以再添加一个指针,实现数组分三块。

      设数组大小为 n ,定义三个指针 left,cur,right:

left:用来标记0序列的末尾,因此初始化为-1;

cur:用来扫描数组,初始化为0;

right:用来标记2序列的起始位置,因此初始化为n 。

在 cur 往后扫描的过程中,保证:

[ 0,left ]内的元素都是0;

[ left + 1,cur - 1 ]内的元素都是1 ;

[ cur, right - 1 ]内的元素是待定元素; 

[ right,n - 1 ]内的元素都是2。

C++算法代码:

class Solution { public: void sortColors(vector<int>& nums) { int left = -1, right = nums.size(), i = 0; while(i < right) { if(nums[i] > 1) { swap(nums[i], nums[--right]); } else if(nums[i] < 1) { swap(nums[i++], nums[++left]); } else { i++; } } } };

算法总结及流程解析:

44.排序数组

题目链接:

912. 排序数组 - 力扣(LeetCode)

题目描述:

题目示例:

解法(数组分三块思想+随机选择基准元素的快速排序):

算法思路:

      我们在数据结构阶段学习的快速排序的思想可以知道,快排最核心的一步就是 Partition (分割数据):将数据按照一个标准,分成左右两部分。

      如果我们使用荷兰国旗问题的思想,将数组划分为左中右三部分:左边是比基准元素小的数据,中间是与基准元素相同的数据,右边是比基准元素大的数据。然后再去递归的排序左边部分和右边部分即可(可以舍去大量的中间部分)。

      在处理数据量有很多重复的情况下,效率会大大提升。

C++算法代码:

class Solution { public: void quicksort(vector<int>& nums, int l, int r) { if(l >= r) { return; } int ra = rand(); int key = nums[ra % (r - l + 1) + l]; //控制随机数的范围在[left, right] int i = l; int left = l - 1; int right = r + 1; while(i < right) { if(nums[i] > key) { swap(nums[i], nums[--right]); } else if(nums[i] < key) { swap(nums[i++], nums[++left]); } else { i++; } } quicksort(nums, l, left); quicksort(nums, right, r); } vector<int> sortArray(vector<int>& nums) { srand(time(NULL)); //种下一个随机数种子 quicksort(nums, 0, nums.size() - 1); return nums; } };

      这里提一句,之前我们学习快排原理数据结构之排序-选择排序&交换排序中实现快排代码使用的获取key的方法是三数取中,这里也能通过,但不进行展示了,只是把三数取中的代码放在下面供大家查看:
      而且相较于之前实现快排的代码,这里使用的数组分三块在效率上是非常快的。因为之前所学的实现快排只是将数组分成两块,如果一个数组相同元素过多就会导致算法复杂度退化,而分成三块后则相同的key则会被忽略。

算法总结及流程解析:

结束语

      到此,43.颜色分类,44.排序数组 这两道算法题就讲解完了。颜色分类:采用三指针法将数组分为0、1、2三个区间,通过left、cur、right指针实现高效分区。排序数组:在传统快排基础上引入荷兰国旗问题的三区划分思想,配合随机基准选择,有效处理重复元素,提升排序效率。希望大家能有所收获!

Read more

揭秘 AIGC 背后的技术:GPT、BERT 与 Transformer 模型的工作原理

揭秘 AIGC 背后的技术:GPT、BERT 与 Transformer 模型的工作原理

一、引言 AIGC 的崛起与重要性 人工智能生成内容(AIGC)已经不再是未来的技术,它正以惊人的速度渗透到各行各业,重新定义了内容创作、媒体生产、甚至人类认知的边界。从深度学习到大规模自然语言处理,AIGC 的崛起代表着一种新型的智能化革命,其核心技术依赖于 Transformer 架构、GPT 和 BERT 等模型。这些技术不仅推动了自然语言处理(NLP)的进步,还在自动化写作、代码生成、艺术创作等多个领域取得了突破性进展。 AIGC 之所以成为技术热潮,背后是其颠覆性的效率提升和创新应用。比如,通过 GPT,我们可以在几秒钟内生成一篇文章,而传统写作过程可能需要几小时,甚至几天。这种技术的普及,不仅大大降低了内容创作的门槛,还为个体创作者、企业甚至国家带来了前所未有的生产力提升。 本文目的与结构概述 本文将深入探讨 AIGC 背后的核心技术——Transformer、GPT 和 BERT,带你一步步了解它们的架构原理、训练机制及实际应用。

By Ne0inhk
从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南

从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南

文章目录 * 从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南 💻✨ * 一、语法纠错:Copilot 如何成为你的“实时校对员” ✅ * 示例 1:自动修复缩进错误 * 示例 2:括号/引号自动闭合与修复 * 示例 3:类型注解缺失的智能补充 * 实战技巧:结合 Linter 使用 Copilot * 二、代码生成:从单行补全到完整函数实现 🧠⚡ * 示例 4:用注释驱动函数生成 * 示例 5:生成单元测试 * 示例 6:异步 HTTP 请求生成 * 三、调试辅助:Copilot 如何帮你“读懂”错误信息 🐞🔍 * 场景:遇到 `KeyError` 怎么办? * 场景:

By Ne0inhk
在昇腾 NPU 上跑 Llama 大模型:从 “踩坑到通关” 的全程实战记

在昇腾 NPU 上跑 Llama 大模型:从 “踩坑到通关” 的全程实战记

在昇腾 NPU 上跑 Llama 大模型:从 “踩坑到通关” 的搞笑实战记 本文分享了在昇腾 NPU 上部署测试 Llama-2-7B 大模型的全过程。提供踩坑经验。作者因其他硬件价格高、服务器昂贵,选择昇腾 NPU,其自主可控的达芬奇架构、完善的开源生态及 GitCode 免费测试资源是主要吸引力。文中详细介绍了 GitCode 上创建昇腾 Notebook 实例的关键配置、环境验证方法,以及安装 transformers 库、下载部署模型的步骤,还记录了遇到的 “torch.npu 找不到”“模型下载需权限” 等四个常见问题及解决方案。通过测试英文生成、中文对话、代码生成三种场景,得出 16-17 tokens/s 的吞吐量,虽低于预期但性能稳定,并给出使用 MindSpeed-LLM 框架、

By Ne0inhk
主流 AI 插件 之一的 Copilot 介绍

主流 AI 插件 之一的 Copilot 介绍

Copilot 是微软推出的一款人工智能助手,旨在通过自然语言交互帮助您提升工作效率和创造力,覆盖多平台(网页端、桌面端、移动端、Edge 浏览器等),提供智能问答、内容生成、代码辅助等功能。其核心定位为“日常 AI 伴侣”,旨在通过自然语言交互提升工作与生活效率。         ⚠️ 注意:自 2024 年起,Copilot 已从独立插件全面整合进 GitHub Enterprise 与 Microsoft 365 开发者计划,部分高级功能(如多文件协同编辑、Agent 模式)需订阅 Copilot Pro 或企业版。 一、Copilot 官网与介绍 1.1 Microsoft Copilot • 定位:微软旗下AI助手,适用于工作与生活,支持多场景应用。 • 功能:文本生成、

By Ne0inhk