力扣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

相关文章

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

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

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 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中,以便后续查