数组排序,有0,1和2,需要就将0排在1之前,1排在2之前

p0,p1,p2分别表示第一个不为0的数字下标,第一个不为1的数字下标,第一个不为2的数字下标。p0,p1从0开始递增,如果p0>p1,则p1 = p0;p2从size()-1开始递减。当出现如下图的前三种情况,替换。因为替换了之后就保证了0在1之前,1在2之前的顺序。如果非上述三种情况,则依次赋值,比如2,0,1三种情况,没办法通过交换使它出现0,1,2.

 

void sort(vector<int>& t) {
	int p0 = 0, p1 = 0, p2 = t.size() - 1;
	while (p0 <= p1 && p1 <= p2) {
		while (t[p0] == 0) p0++;
		while (t[p1] == 1) p1++;
		while (t[p2] == 2) p2--;
		if (p0 > p1) p1 = p0;//如果是这种情况必然说明p1指向的就是0
		if (p0 < p1 && t[p0] == 1 && t[p1] == 0) {
			swap(t[p0], t[p1]);
		}
		else if (p0 < p2 && t[p0] == 2 && t[p2] == 0) {
			swap(t[p0], t[p2]);
		}
		else if (p1 < p2 && t[p1] == 2 && t[p2] == 1) {
			swap(t[p1], t[p2]);
		}
		else if(p0 < p1 && p1<p2){
			t[p0] = 0;
			t[p1] = 1;
			t[p2] = 2;
		}
	}
}

同类型的题目:

假设我们现在需要对 D,a,F,B,c,A,z 这个字符串进行排序,要求将其中所有小写字母都排在大写字母的前面,但小写字母内部和大写字母内部不要求有序。比如经过排序之后为 a,c,z,D,F,B,A,这个如何来实现呢?如果字符串中存储的不仅有大小写字母,还有数字。要将小写字母的放到前面,大写字母放在最后,数字放在中间,不用排序算法,又该怎么解决呢?

选课的问题是指在选修某些课程之前需要先完成一些先修课程。给定课程总量以及它们的先决条件,我们需要返回一种可以完成所有课程学习的顺序,或者判断是否可能完成所有课程的学习。如果可以完成,返回true,否则返回false。 例如,在输入为2, [[1,0]]的情况下,表示总共有2门课程,要学习课程1,需要先完成课程0。因此,正确的课程顺序为[0,1]。 根据给定的先决条件,我们可以通过拓扑排序的方法来解决这个问题。拓扑排序是一种对有向无环图(DAG)进行排序的算法。在这个问题中,课程可以看作是图中的节点,先决条件可以看作是节点之间的有向边。如果存在一个拓扑排序,就说明可以完成所有课程的学习,否则就不可能完成。 我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来实现拓扑排序。具体步骤如下: 1. 构建有向图:将课程和先决条件转化为有向图的表示,可以使用邻接表或邻接矩阵来存储图的信息。 2. 统计入度:遍历有向图的边,统计每个节点的入度(即有多少节点依赖于该节点)。 3. 拓扑排序:从入度为0的节点开始,依次将节点加入结果列表,并更新相关节点的入度。如果最终结果列表中的节点数量等于课程总量,说明可以完成所有课程的学习;否则,不可能完成。 根据以上方法,我们可以解决选课问题并找到合适的学习顺序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [PigyChan_LeetCode 210. 课程表 II](https://blog.csdn.net/qq_43596544/article/details/109265780)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [2021-10-27:课程表。...在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisi](https://blog.csdn.net/weixin_48502062/article/details/121003686)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值