算法-技巧-中等-颜色分类

news/2024/11/7 6:43:23/

记录一下算法题的学习12

颜色分类

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

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

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

 统计数组中0,1,2的个数,根据它们的数量,重写整个数组 代码展示:

class Solution {public void sortColors(int[] nums) {HashMap<Integer,Integer>  map=new HashMap<Integer,Integer>();map.put(0,0);map.put(1,0);map.put(2,0);//统计出数组中 0,1,2 的个数for(int num:nums){Integer count=map.get(num);map.put(num,(count+1));}//根据它们的数量,重写整个数组(强制)for (int i = 0; i < nums.length; i++) {if (i < map.get(0))nums[i] = 0;else if (i < map.get(0) + map.get(1))nums[i] = 1;else if (i < map.get(0) + map.get(1) + map.get(2))nums[i] = 2;}System.out.println(Arrays.toString(nums));}
}

不讲武德 使用 Arrays.sort() 函数 代码展示(题目答案顺序刚好符合,否则也用不了)

class Solution {public void sortColors(int[] nums) {Arrays.sort(nums);}
}

荷兰国旗问题 红白蓝 

 随机选择一个元素作为切分元素P1,然后经过一次扫描,通过交换不同位置的元素使得数组元素按照数值大小分为以下三个部分

举例说明:

class Solution {public void sortColors(int[] nums) {//如果不能满足红白蓝三种颜色分类排序,直接结束if(nums.length<2){return;} //满足红白蓝三种颜色分类int p0=-1;int p1=0;int p2=nums.length;while(p2>p1){if(nums[p1]==0){p0++;swap(nums,p1,p0);p1++;}else if(nums[p1]==1){p1++;}else{p2--;swap(nums,p1,p2);}     }}//定义一个交换数组元素位置的功能函数方法public void swap(int[] nums,int index1,int index2){int temp=nums[index1];nums[index1]=nums[index2];nums[index2]=temp;}
}

leetcode中的解法是单指针和双指针解法,以下是复制粘贴代码

单指针
class Solution {public void sortColors(int[] nums) {int n = nums.length;int ptr = 0;for (int i = 0; i < n; ++i) {if (nums[i] == 0) {int temp = nums[i];nums[i] = nums[ptr];nums[ptr] = temp;++ptr;}}for (int i = ptr; i < n; ++i) {if (nums[i] == 1) {int temp = nums[i];nums[i] = nums[ptr];nums[ptr] = temp;++ptr;}}}
}
双指针
class Solution {public void sortColors(int[] nums) {int n = nums.length;int p0 = 0, p2 = n - 1;for (int i = 0; i <= p2; ++i) {while (i <= p2 && nums[i] == 2) {int temp = nums[i];nums[i] = nums[p2];nums[p2] = temp;--p2;}if (nums[i] == 0) {int temp = nums[i];nums[i] = nums[p0];nums[p0] = temp;++p0;}}}
}

 结束拜拜!


http://www.ppmy.cn/news/1241557.html

相关文章

git分支命名规范

https://www.cnblogs.com/wq-9/p/16968098.html

document load 和 document ready 的区别

"document load" 和 "document ready" 都是 JavaScript 中用于处理文档加载事件的术语&#xff0c;但是它们之间有一些重要的区别。 document load 在传统的 JavaScript 中&#xff0c;document.load 事件是当整个 HTML 文档完全加载并出现在浏览器中时触…

css加载会造成阻塞吗??

前言 前几天面试问到了这个问题&#xff0c;当时这个答得不敢确定哈哈&#xff0c;虽然一面还是过了 现在再分析下这个&#xff0c;总结下&#xff0c;等下次遇到就能自信得回答&#xff0c;666 准备工作 为了完成本次测试&#xff0c;先来科普一下&#xff0c;如何利用chr…

面试笔记--Linux常用命令

文件和目录操作&#xff1a; ls: 列出目录内容 例子&#xff1a;ls -l - 列出详细信息&#xff0c;包括权限、所有者等 cd: 切换目录 例子&#xff1a;cd Documents - 进入 “Documents” 目录 pwd: 显示当前工作目录 例子&#xff1a;pwd - 显示当前工作目录的路径 cp: 复制文…

排序算法-----基数排序

目录 前言 基数排序 算法思想 ​编辑 算法示例 代码实现 1.队列queue.h 头文件 2.队列queue.c 源文件 3.主函数&#xff08;radix_sort实现&#xff09; 算法分析 前言 今天我想把前面未更新完的排序算法补充一下&#xff0c;也就是基数排序的一种&#xff0c;这是跟…

Windows系统管理之备份与恢复

本章目录&#xff1a; 一. 本章须知&#xff1a; 前置条件 需要创建一个新的磁盘 前置条件2 给新添加的磁盘分盘 二. 了解开启并学会使用Windows sever backup 如何使用备份与恢复“备份计划”“一次性备份”“恢复” 最后是用命令行“一次性备份命令 ”完成一次备份 话不多说 …

LeetCode [简单] 160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#xff0c;链表必须 保持其原始结构 。 160.…

kolla-ansible 部署OpenStack云计算平台

目录 一、环境 二、安装及部署 三、测试 一、环境 官方文档&#xff1a;https://docs.openstack.org/kolla-ansible/yoga/user/quickstart.html rhel8.6 网络设置&#xff1a; 修改网卡名称 网络IP&#xff1a; 主机名&#xff1a; 网络时间协议 配置软件仓库 vim docke…