分治算法(1)_颜色分类

news2024/11/25 12:40:26

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

分治算法(1)_颜色分类

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 分治思想简介 :

2. 题目链接 :

3. 题目描述 :

4. 解法(三指针) :

    题目分析 :

    算法思路 :

    代码展示 :

    结果分析 :


1. 分治思想简介 :

        分治思想(Divide and Conquer)是一种广泛应用于算法设计中的重要策略,其基本思想是将一个复杂的问题分解为多个较简单的子问题,递归地解决这些子问题,然后将它们的解合并为原问题的解。(分而治之)

        分治思想在很多经典算法中得到了应用,以下是几个常见的例子:

1. 归并排序(Merge Sort):将数组分为两个部分,分别进行排序,然后合并两个已排序的部分。
2. 快速排序(Quick Sort):选择一个“基准”元素,将数组划分为比基准小和大的两部分,递归排序这两部分。
3. 二分查找(Binary Search):在有序数组中查找一个元素,通过不断地将搜索范围减半来达到快速查找的目的。
4. 矩阵乘法(Strassen’s Algorithm):通过分解矩阵为子矩阵来减少乘法的复杂度。
5. 快速傅里叶变换(FFT):在信号处理和图像处理中用于高效地计算离散傅里叶变换。

        分治法的优点:

效率:通过将问题规模减小到较小的子问题,能够在较短的时间内求解复杂问题。
清晰性:分治法的递归结构使得算法逻辑更加清晰和易于理解。
适应性:许多问题可以自然地用分治法来解决,从而减少编程的复杂性。

2. 题目链接 :

OJ链接 : 颜色分类

3. 题目描述 :

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] 为 01 或 2

4. 解法(三指针) :

    题目分析 :

        题目要求: 给定一个包含红色、白色和蓝色、共 n个元素的组数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。(使用整数 0、 1 和 2 分别表示红色、白色和蓝色。)

        所以这个我们只能对原数组进行排序,不能额外创建空间,更不能直接使用库里面的sort(虽然能通过~~):

class Solution {
public:
    void sortColors(vector<int>& nums) {
        sort(nums.begin(), nums.end());
    }
};

    算法思路 :

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

设数组大小为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]内的元素都是2 

        所以我们在扫描的过程中有:

 1. nums[cur] == 0 : swap(nums[++left], nums[cur++])

 2. nums[cur] == 1 : cur++

 3. nums[cur] == 2 : swap(nums[--right], nums[cur])  注意这里cur不需要++,因为[cur, right - 1]是待定元素,还需要判断!

    代码展示 :

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

    结果分析 :

 时间复杂度分析:
    O(n),其中 n 是数组 nums 的长度。每个元素最多处理一次。
空间复杂度分析:
    使用的额外空间:该算法只使用了常量级别的额外空间,主要是 left、right 和 cur 三个指针,没有使用额外的数组或数据结构。因此,空间复杂度为:O(1),只使用了常数级的空间。

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

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

相关文章

PostgreSQL 任意命令执行漏洞(CVE-2019-9193)

记一次授权攻击通过PostgreSql弱口令拿到服务器权限的事件。 使用靶机复现攻击过程。 过程 在信息收集过程中&#xff0c;获取到在公网服务器上开启了5432端口&#xff0c;尝试进行暴破&#xff0c;获取到数据库名为默认postgres&#xff0c;密码为1 随后连接进PostgreSql …

(杨辉三角) 攻防世界--->notsequence

学习笔记。(不想看可以直接跳正文。) 前言&#xff1a;仿佛又回到高中 - - 只不过&#xff0c;是以另一种形式再次出现。 学习思维为主&#xff0c;做题位次。&#xff08;后面再补。&#xff09; 前置知识&#xff1a; 什么是杨辉三角&#xff1a; 杨辉三角_百度百科 (bai…

【CSS in Depth 2 精译_045】7.1 CSS 响应式设计中的移动端优先设计原则(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

MySQL【知识改变命运】02

数据类型 1&#xff1a;数据值类型2&#xff1a;字符串类型/二进制类型3&#xff1a;⽇期类型 前言&#xff1a;数据类型一共分为四类&#xff1a;数据值类型&#xff0c;字符串类型&#xff0c;二进制类型&#xff0c;日期类型。 1&#xff1a;数据值类型 类型大小说明BIT[(M…

Spring Boot 集成 Flowable UI 实现请假流程 Demo

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代企业应用中&#xff0c;工作流管理是一个至关重要的部分。通过使用Spring Boot和Flowable&#xff0c;可以方便地构建和管理工作流。本文将详细介绍如何在Spring Boot项目中集成Flowable UI&#xff0c…

【Java】—— 泛型:泛型的理解及其在集合(List,Set)、比较器(Comparator)中的使用

目录 1. 泛型概述 1.1 生活中的例子 1.2 泛型的引入 2. 使用泛型举例 2.1 集合中使用泛型 2.1.1 举例 2.1.2 练习 2.2 比较器中使用泛型 2.2.1 举例 2.2.2 练习 1. 泛型概述 1.1 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&…

Chromium 添加书签功能浅析c++

1、在点击添加书签时候此UI控制逻辑代码在 chrome\browser\ui\views\bookmarks\bookmark_bar_view.cc chrome\browser\ui\views\bookmarks\bookmark_bar_view.h 可以在此看到完成 移除 按钮逻辑&#xff0c;以及书签监听事件等。。。 // Implementation for BookmarkNodeAdd…

FastAdmin Apache下设置伪静态

FastAdmin Apache下设置伪静态 一、引言 FastAdmin 是一个基于ThinkPHP和Bootstrap框架开发的快速后台开发框架&#xff0c;它以其简洁、高效、易于扩展的特点&#xff0c;广受开发者的喜爱。在部署FastAdmin项目时&#xff0c;为了提高访问速度和用户体验&#xff0c;我们通…

VLAN:虚拟局域网

VLAN:虚拟局域网 交换机和路由器协同工作后&#xff0c;将原先的一个广播域&#xff0c;逻辑上&#xff0c;切分为多个广播域。 第一步:创建VLAN [SW1]dispaly vlan 查询vlan VID&#xff08;VLAN ID&#xff09;:用来区分和标定不同的vlan 由12位二进制构成 范围: 0-4…

[3D打印]拓竹切片软件Bambu Studio使用

Bambu Studio 界面功能 材料 不同材料 一般使用的是PLA, PETG, ABS PLA(57℃), PETG(66℃)的强度以及耐高温的能力比较差, ABS有味道, 不环保但是强度比较高(85℃) TPU: 不支持AMS, 数字小硬度小, 打印出来有亮光 TPE: 和上面一样, 打印出来是哑光的, 但是打印的难度比较…

物联网智能项目(含案例说明)

物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;智能项目是指利用物联网技术将各种物理设备、传感器、软件、网络等连接起来&#xff0c;实现设备之间的互联互通&#xff0c;并通过数据采集、传输、处理和分析&#xff0c;实现智能化管理和控制的项目。以…

Docker_速通_01

Docker Docker笔记连接相关概念如下安装运行命令 命令镜像容器run细节根据容器制作新镜像对正在运行容器的修改,保存为镜像保存成文件加载文件成镜像 分享镜像登录修改名字 docker tag推送镜像 目录挂载卷映射创建卷 容器之间直接访问查看容器细节容器内部互相访问自定义网络创…

[NeurIPS 2022] STaR: Bootstrapping Reasoning With Reasoning

Contents IntroductionMethodExperimentsReferences Introduction CoT 推理可以有效提升 LLM 推理能力&#xff0c;但 few-shot prompting 无法发挥 CoT 的全部潜力&#xff0c;训练能够生成中间推理步骤 (i.e., rationale) 的 LLM 又需要大量人工标注 rationale&#xff0c;为…

Python 从入门到实战35(进程-multiprocessing模块)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了turtle库绘制图画操作的相关知识。今天学习一下…

anaconda创建环境无法定位到正确的Python解释器版本

一、概述 因为需要使用到torch其对Python的版本有些限制&#xff0c;我使用anacoda创建了Python版本3.8的环境&#xff0c;出现了一些问题&#xff0c;具体问题在下面进行分析。 二、具体分析 &#xff08;一&#xff09;问题概述 如图所示&#xff0c;在新创建的环境中&…

跟《经济学人》学英文:2024年10月05日这期 Dismantling Google is a terrible idea

Dismantling Google is a terrible idea Despite its appeal as a political rallying cry dismantling: &#xff08;枪支&#xff09;分解&#xff1b;解散&#xff1b;拆除&#xff1b;&#xff08;dismantle的现在分词&#xff09; appeal&#xff1a;吸引力 rallying …

Apollo9.0 Planning2.0决策规划算法代码详细解析 (5): OnLanePlanning::Init()

&#x1f31f; 面向自动驾驶规划算法工程师的专属指南 &#x1f31f; 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏&#xff01;本专栏专为自动驾驶规划算法工程师量身打造&#xff0c;旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…

nginx反向代理,负载均衡,HTTP配置简述(说人话)

文章目录 反向代理正向代理反向代理普通反向代理分析解释 四层反向代理 负载均衡HTTPS配置基本配置Nginx 账户认证功能 反向代理 正向代理 所谓的正向代理&#xff0c;通俗来说就是&#xff0c;正向代理是一个位于客户端和目标服务器之间的服务器&#xff0c;它代表客户端向目…

Python 工具库每日推荐 【NumPy】

文章目录 引言Python科学计算库的重要性今日推荐:NumPy工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:图像处理案例分析高级特性广播机制高级索引通用函数(ufunc)性能优化技巧扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeS…

哪个牌子充电宝好用性价比又高?推荐5款2024年性价比充电宝!

在充电宝的世界里&#xff0c;技术的进步日新月异&#xff0c;它们早已超越了简单的便携充电功能&#xff0c;成为了我们日常生活中不可或缺的移动电源。然而&#xff0c;随着市场的繁荣&#xff0c;选择一款可靠、安全的充电宝变得愈发困难。许多品牌为了降低成本&#xff0c;…