Alogrithm:三色棋

1. 说明

三色旗的问题最早由 E.W.Diikstra 所提出,他所使用的用语为 Dutch Nation Flag(Dijkstra 为荷兰人),而多数的作者则使用 Three-Color Flag 来称之。
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。

2. 解法

三色旗问题可以用一个线性时间算法来解决,利用双指针法将问题简化为在数组中按照顺序排放三种颜色的元素。我们可以用整数表示颜色(例如:0 表示蓝色,1 表示白色,2 表示红色)。目标是以最少的交换次数将数组按照颜色排序为蓝、白、红的顺序。

2.1 思路分析

  • 定义三个指针:
  • 遍历数组,根据 mid 指针所指元素的值进行以下操作:
  • 停止条件是 mid > high。

2.2 实现代码

#include <stdio.h>void sortColors(int arr[], int n) {int low = 0, mid = 0, high = n - 1;while (mid <= high) {if (arr[mid] == 0) {  // 蓝色// 交换 mid 和 low 指针的元素int temp = arr[low];arr[low] = arr[mid];arr[mid] = temp;low++;mid++;} else if (arr[mid] == 1) {  // 白色mid++;  // 直接跳过} else {  // 红色// 交换 mid 和 high 指针的元素int temp = arr[high];arr[high] = arr[mid];arr[mid] = temp;high--;}}
}void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int flags[] = {2, 0, 1, 1, 0, 2, 1, 0, 2};int n = sizeof(flags) / sizeof(flags[0]);printf("Before sorting:\n");printArray(flags, n);sortColors(flags, n);printf("After sorting:\n");printArray(flags, n);return 0;
}

2.3 样例运行

2.3.1 输入

flags[] = {2, 0, 1, 1, 0, 2, 1, 0, 2};

2.3.2 输出

Before sorting:
2 0 1 1 0 2 1 0 2 
After sorting:
0 0 0 1 1 1 2 2 2 

2.4 复杂度分析

  • 时间复杂度:O(n),只需遍历数组一次。
  • 空间复杂度:O(1),仅用到三个指针,没有额外的空间开销。
这种方法通过双指针和交换操作,将交换次数最小化并高效解决问题,非常适合处理这类三分区问题。

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

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

相关文章

需要排序的子数组

题目描述 给定一个无序数组arr&#xff0c;求出需要排序的最短子数组长度 要求&#xff1a;O(N) 如输入&#xff1a;arr{2,3,7,5,4,6}&#xff0c;返回4&#xff0c;因为只有{7,5,4,6}需要排序。 分析 以{2,3,7,5,4,6,8,9}为例&#xff1a; 前端小于最小波谷&#xff08;3…

Python酷库之旅-第三方库Pandas(154)

目录 一、用法精讲 701、pandas.Timestamp.utcnow方法 701-1、语法 701-2、参数 701-3、功能 701-4、返回值 701-5、说明 701-6、用法 701-6-1、数据准备 701-6-2、代码示例 701-6-3、结果输出 702、pandas.Timestamp.utcoffset方法 702-1、语法 702-2、参数 70…

如何启动神通数据库?神通数据库的启动方式一共有几种?

简单总结&#xff0c;神通数据库启动有三种方式&#xff1a; 1、dba管理工具方式 2、服务方式 &#xff08;1&#xff09;service oscardb_OSRDBd restart &#xff08;2&#xff09;/etc/init.d/oscardb_OSRDBd restart &#xff08;3&#xff09;systemctl start oscardb_OS…

Modbus Poll的使用

最近从串口调试助手接触到了Modbus Poll&#xff0c;一开始用的时候有些生疏&#xff0c;了解之后不得不说真香。 相对于串口调试助手&#xff0c;有些设备厂家会给一些点表和指令码&#xff0c;有些也可以通过modbus协议解析出来&#xff0c;相对来说&#xff0c;使用Modbus …

第四学期-智能数据分析-期末复习题

智能数据分析期末复习&#xff08;2024春&#xff09; 【考试形式】&#xff1a;闭卷&#xff0c;90分钟&#xff0c;笔试 【题型分布】&#xff1a; 单选题10题&#xff0c;每题3分&#xff0c;共计30分 判断题10题&#xff0c;每题2分&#xff0c;共计20分 填空题5题&…

总结的一些MySql面试题

目录 一&#xff1a;基础篇 二&#xff1a;索引原理和SQL优化 三&#xff1a;事务原理 四&#xff1a;缓存策略 一&#xff1a;基础篇 1&#xff1a;定义&#xff1a;按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享 的…

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型&#xff08;如通义千问&#xff09;&#xff0c;来开发一个chat对话类型的ai应用&#xff0c;我需要先了解OpenAI的API文档&#xff0c;请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…

python游戏设计---飞机大战

1.前言 上次做飞机大战游戏有人这么说&#xff1a; 好好好&#xff01;今天必须整一个&#xff0c;今天我们来详细讲解一下&#xff0c;底部找素材文件下载&#xff01;&#xff01;&#xff01; 2.游戏制作 目录如下&#xff1a; 1.导入的包 import pygame import sys imp…

Final Vision Get Picture Pos Send 2 Python Control Robot

import tkinter as tk from tkinter import messagebox, filedialog from tkinter import ttk import socket import threading import subprocess from datetime import datetime from PIL import Image, ImageTk import time # 全局变量 client_socket None connected Fal…

Spring框架-IoC的使用(基于XML和注解两种方式)

一、Spring IoC使用-基于XML 1 IoC使用-基于XML 使用SpringIoC组件创建并管理对象 1.1 创建实体类 package com.feng.ioc.bean;import java.util.Date;/*** program: spring-ioc-demo1* description: 学生实体类* author: FF* create: 2024-12-04 18:53**/ public class Stud…

C++编程控制舵机的实现与应用

在嵌入式编程和物联网应用中&#xff0c;舵机是一种非常重要的执行器&#xff0c;广泛应用于机器人、遥控玩具、机械臂、摄像头云台等多个领域。舵机不仅能够精准地控制角度位置&#xff0c;还能在一定的工作范围内持续保持该位置。在本篇文章中&#xff0c;我们将站在 C 编程教…

对于MySQL中视图的相关实验

以下用该表举例&#xff1a; /*Table structure for table employees */ DROP TABLE IF EXISTS employees; CREATE TABLE employees ( employee_id int(6) NOT NULL DEFAULT 0, first_name varchar(20) DEFAULT NULL, last_name varchar(25) NOT NULL, email varc…

day-90 使数组为空的最少操作次数

思路 统计每个数字出现的次数&#xff0c;计算每个数字的操作次数&#xff0c;将所有操作次数累加返回即可 解题过程 对于每个数字&#xff08;假设出现次数num&#xff09;,如果num等于1,返回-1&#xff1b;如果num%3等于0&#xff0c;返回num/3&#xff1b;如果num%3不等于0…

6.xftp使用教程

xftp用于windows和linux之间进行文件互传 1.先安装xftp软件&#xff0c;并双击打开 2.文件 – 新建 3.配置参数 4.连接 5.把需要的文件扯到右边

[nmap] 端口扫描工具的下载及详细安装使用过程(附有下载文件)

前言 nmap网络连接端扫描软件&#xff0c;用于主机发现、端口扫描、版本侦测、操作系统侦测 namp 链接&#xff1a;https://pan.quark.cn/s/4ea55a2d62c3 提取码&#xff1a;aXnr 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 链接失效&#xff08;可能被官…

详解组合模式

引言 有一种情况&#xff0c;当一组对象具有“整体—部分”关系时&#xff0c;如果我们处理其中一个对象或对象组合&#xff08;区别对待&#xff09;&#xff0c;就可能会出现牵一发而动全身的情况&#xff0c;造成代码复杂。这个时候&#xff0c;组合模式就是一种可以用一致的…

计算机网络复习——概念强化作业

物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…

SQL语法——DQL查询

1.查询: 基础查询&#xff1a; select 列名1,列名2 from 表名; # 输入列名为*时为全查 条件查询&#xff1a; select 列名 from 表名 where 条件; #条件中含字符串时为字符串

Manus手套动作捕捉AI训练灵巧手

随着人工智能&#xff08;AI&#xff09;和机器人技术的融合日益紧密&#xff0c;使用真实动作数据AI扩容训练机器人的方式正在被用于开发更富表现力的机器人。Manus手套凭借精准的动作捕捉技术和导出数据的强大兼容性&#xff0c;在灵巧手的研发和应用中发挥了重要作用。 手部…

Altium Designer学习笔记 29 PCB布线_信号线

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…