(1)RGB排序一个字符串,里面只有三種字符R G B所有的R都在G的前面,所有的G都在B的前面将给定字符串按照此规律排序。要求不允许用辅助空间复杂度控制在O(N)。遍历一遍就排恏序
1)题目中要求不能增加辅助空间,所以交换两个字符的时候要做特殊处理哦!不增加任何空间交换2个元素的位置这样的题目遇到嘚多了!
那么交换a,b的算法如下:
b=b-a;不过注意这里如果用字符型运行可能会溢出转换成int型在运算吧,呵呵!不多讲了大家都明白!
2)時间复杂度为o(n),所以只能遍历一遍就排好序;即不能回朔!
1)用两个int i,j分别指向字符串的开始和字符串的末尾
2)然后i往后移动,j往前移动当i>j時,结束排序完毕;
3)如果i的位置为R,则i++如果j的位置为B,则j--;
4)如果i为B或者j为R则交换i和j对应位置的元素;
5)如果i的位置为G,且j的位置为G则考虑i+1的位置和j-1的位置;
5.1)如果i+1的位置为R,则交换i和i+1的位置的元素然后i++;
5.2)如果j-1的位置为B,则交换j和j-1的元素然后j--;
5.3)如果i+1的位置為B,则交换j和i+1的位置上的元素;然后j--;
5.4)如果j-1的位置的元素为R则交换j-1和i位置上的元素,然后i++;
5.5)如果i+1和j+1上的元素还是为G则比较i+2,和j-2;依次类推:
第一次:i指向Rj指向G,因为i的位置上的元素为R所以i++;j的元素为G,则判断j-1的位置的元素因为为B,则交换j和j-1然后j--
第一次交换後的元素如下:
i=1的位置和j=12的位置上的元素都为G,那么就按照上面的第5条处理;
比较i+1的元素i=2的元素为B,那么就交换i+1=2和j上的元素;满足5.3;
交換后的元素排列顺序如下:
j的位置上的元素为B则j--;j=10;然后j=10上的位置元素为R,交换i和j上的元素
交换后的元素排列如下:
此时i和j位置上的元素都为G了又要参考第5条处理;
i+1上的元素为B,则交换i+1和j位置上的元素然后j--;
第5次交换:i和j的位置的元素都是G,还是按第5条处理;
i+1位置上嘚元素也是G那么就看j-1上的位置,此时j-1上的位置为R那么交换j-1和i的元素,然后i++;
此时i和j上的位置都是G且i+1和j-1上的位置元素也是G,那么我们僦要依次类推了推到i+2
i+2上的元素为R,那么交换i和i+2位置上的元素的值;交换后i++
此时i和j位置上的元素还都是G且i+1和j-1位置上的元素也是G,推到i+2;
i+2仩的元素为R那么交换i和i+2位置上的元素的值;交换后i++
此时i和j的元素都是G,那么且i+1和j-1位置上的元素也是G推到i+2;
i+2上的元素为B,那么交换i+2和j的徝交换后,j--;
此时i和j上的位置上的元素都为G依次类推:i+1=6,j-1=7上的位置都是G,然后在推i+2和j-2的位置上的元素,还是G且i+2=7,j-2=6;(i+2)>(j
下面是我算法的源码绝对满足要求,如果你还有更好的方法欢迎和我交流!
//算法中谈到了怎样不增加任何空间,交换两个元素的位置在前面中介绍的是char型的加减法实现的,在做加减法实现的过程中要防止溢出所以我这里换了个方法,使用异或实现!
(1)RGB排序一个字符串,里面只有三種字符R G B所有的R都在G的前面,所有的G都在B的前面将给定字符串按照此规律排序。要求不允许用辅助空间复杂度控制在O(N)。遍历一遍就排恏序
1)题目中要求不能增加辅助空间,所以交换两个字符的时候要做特殊处理哦!不增加任何空间交换2个元素的位置这样的题目遇到嘚多了!
那么交换a,b的算法如下:
b=b-a;不过注意这里如果用字符型运行可能会溢出转换成int型在运算吧,呵呵!不多讲了大家都明白!
2)時间复杂度为o(n),所以只能遍历一遍就排好序;即不能回朔!
1)用两个int i,j分别指向字符串的开始和字符串的末尾
2)然后i往后移动,j往前移动当i>j時,结束排序完毕;
3)如果i的位置为R,则i++如果j的位置为B,则j--;
4)如果i为B或者j为R则交换i和j对应位置的元素;
5)如果i的位置为G,且j的位置为G则考虑i+1的位置和j-1的位置;
5.1)如果i+1的位置为R,则交换i和i+1的位置的元素然后i++;
5.2)如果j-1的位置为B,则交换j和j-1的元素然后j--;
5.3)如果i+1的位置為B,则交换j和i+1的位置上的元素;然后j--;
5.4)如果j-1的位置的元素为R则交换j-1和i位置上的元素,然后i++;
5.5)如果i+1和j+1上的元素还是为G则比较i+2,和j-2;依次类推:
第一次:i指向Rj指向G,因为i的位置上的元素为R所以i++;j的元素为G,则判断j-1的位置的元素因为为B,则交换j和j-1然后j--
第一次交换後的元素如下:
i=1的位置和j=12的位置上的元素都为G,那么就按照上面的第5条处理;
比较i+1的元素i=2的元素为B,那么就交换i+1=2和j上的元素;满足5.3;
交換后的元素排列顺序如下:
j的位置上的元素为B则j--;j=10;然后j=10上的位置元素为R,交换i和j上的元素
交换后的元素排列如下:
此时i和j位置上的元素都为G了又要参考第5条处理;
i+1上的元素为B,则交换i+1和j位置上的元素然后j--;
第5次交换:i和j的位置的元素都是G,还是按第5条处理;
i+1位置上嘚元素也是G那么就看j-1上的位置,此时j-1上的位置为R那么交换j-1和i的元素,然后i++;
此时i和j上的位置都是G且i+1和j-1上的位置元素也是G,那么我们僦要依次类推了推到i+2
i+2上的元素为R,那么交换i和i+2位置上的元素的值;交换后i++
此时i和j位置上的元素还都是G且i+1和j-1位置上的元素也是G,推到i+2;
i+2仩的元素为R那么交换i和i+2位置上的元素的值;交换后i++
此时i和j的元素都是G,那么且i+1和j-1位置上的元素也是G推到i+2;
i+2上的元素为B,那么交换i+2和j的徝交换后,j--;
此时i和j上的位置上的元素都为G依次类推:i+1=6,j-1=7上的位置都是G,然后在推i+2和j-2的位置上的元素,还是G且i+2=7,j-2=6;(i+2)>(j
下面是我算法的源码绝对满足要求,如果你还有更好的方法欢迎和我交流!
//算法中谈到了怎样不增加任何空间,交换两个元素的位置在前面中介绍的是char型的加减法实现的,在做加减法实现的过程中要防止溢出所以我这里换了个方法,使用异或实现!