当前位置:网站首页>LeetCode75:颜色分类-C语言一次遍历求解
LeetCode75:颜色分类-C语言一次遍历求解
2022-08-09 09:29:00 【农场主er】
问题描述:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
思路分析:
- 如果单纯用排序算法,则忽略了实际问题的条件:数组中只有三种元素,并且元素的位置已经有数;
- 我第一次求解时两次遍历:第一遍找出0,与开始的元素进行交换;第二遍找出1,接着第一遍中已交换好的下标元素进行交换;
- 考虑能不能一次遍历?引入两个指针:
index0(初始值为0),作用是遍历发现0时,与当前元素交换
index2(初始值为numsSize-1),作用是发现2时,与当前元素交换
代码实现
//交换两元素,注意运用指针
void swap(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void sortColors(int* nums, int numsSize) {
//定义元素0的初始最左指针
int index0 = 0;
//定义当前指针
int cur = 0;
//定义元素2的初始最右指针
int index2 = numsSize - 1;
//判断循环条件,不要忘记是<=,否则最后一个元素的位置确定不了
while (cur <=index2) {
//发现元素0,交换完毕后两个指针都要增加,因为交换到cur的元素只能是1
if (nums[cur] == 0) {
swap(nums + cur, nums + index0);
index0++;
cur++;
}
//发现元素2,交换完注意cur指针不能增加,因为从cur之后交换过来的元素可能是0,需要再次判断cur指向的值
else if (nums[cur] == 2) {
swap(nums + cur, nums + index2);
index2--;
}
//发现元素1,直接后移当前指针
else
cur++;
}
}
复杂度分析
- 时间复杂度:由于只进行了一次遍历,故为O(n);
- 空间复杂度:由于没有额外利用数组以外的空间,故为O(1)。
边栏推荐
猜你喜欢
随机推荐
测试计划包括哪些内容?目的和意义是什么?
游戏测试的概念是什么?测试方法和流程有哪些?
BigDecimal用法常用操作记录
Do you know the principles of test cases and how to write defect reports?
一个项目的整体测试流程有哪几个阶段?测试方法有哪些?
7.Collections工具类
本体开发日记03-排错进行时
A Practical Guide to Building OWL Ontologies using Protege4 and CO-ODE Tools - Version 1.3 (7.4 Annotation Properties - Annotation Properties)
Sweet alert
WAVE SUMMIT 2022深度学习开发者峰会
unittest测试框架原理及测试流程解析,看完绝对有提升
安装torch_sparse失败解决方法
What are the basic concepts of performance testing?What knowledge do you need to master to perform performance testing?
全网最全的软件测试基础知识整理(新手入门必学)
2021-04-26QGIS3.10加载天地图影像(地图瓦片)的一种方法
【面试体系知识点总结】---JVM
Ontology Development Diary 01-Jena Configuration Environment Variables
测试用例的原则、缺陷报告怎么写你都知道吗?
6.File类
Go-指针的那些事