力扣hot100:75. 颜色分类(双指针)

2024-06-16 04:52

本文主要是介绍力扣hot100:75. 颜色分类(双指针),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

75.颜色分类

本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。

75. 颜色分类

在这里插入图片描述

1、遍历两遍

遍历两遍,第一遍放置0的位置,第二遍放置1的位置,我们只需要维护一个当前放置位置即可。
在这里插入图片描述

class Solution {
public:void sortColors(vector<int>& nums) {//扫描两遍,第一遍放好0的位置,第二遍放1int zero = 0;for(int i = 0; i < nums.size(); ++ i){if(nums[i] == 0){swap(nums[i], nums[zero ++]);}}//复用zerofor(int j = zero; j < nums.size(); ++ j){if(nums[j] == 1){swap(nums[j], nums[zero ++]);}}return;}
};

2、遍历一遍双指针

difficult to achieve

我们维护一个0的位置,并且维护一个1的位置:

  • 确保1的位置不小于0的位置
  • 当需要放入1时,直接加在当前指向需要放置的1的位置即可。
  • 当需要放入0时,如果后面有1,这会打断1,不过,我们可以把这个1再插入1的位置即可。如果没有1直接放入

这种方法比较难写,情况有点多,实现起来比较复杂。由于时间复杂度差不多,因此推荐使用简单方法实现!

class Solution {
public:void sortColors(vector<int>& nums) {//扫描两遍,第一遍放好0的位置,第二遍放1int zero = 0;int one = 0;for(int i = 0; i < nums.size(); ++ i){//确保one在正确位置,情况分类比较难if(nums[i] == 1){swap(nums[i], nums[one ++]);}else if(nums[i] == 0){if(zero == one){swap(nums[zero ++], nums[i]);one ++;}else{if(zero < one && zero != 0){//0有数,1也有数swap(nums[one ++], nums[i]);nums[one - 1] = 1;nums[zero ++] = 0;}else{//0没数if(one != i){nums[zero ++] = 0;swap(nums[one], nums[i]);nums[one] = 1;}else{swap(nums[zero ++],nums[i]);}one++;}}}}return;}
};

3、双指针交换2的位置

class Solution {
public:void sortColors(vector<int>& nums) {int n = nums.size();int p0 = 0, p2 = n - 1;for (int i = 0; i <= p2; ++i) {while (i <= p2 && nums[i] == 2) {swap(nums[i], nums[p2]);--p2;}if (nums[i] == 0) {swap(nums[i], nums[p0]);++p0;}}}
};

这篇关于力扣hot100:75. 颜色分类(双指针)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065500

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD