2019.6.4 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
空间复杂度技巧题。
条件不多,很容易能够想到交换的思路。用三指针法,移动指针i,当i小于twoflag时,与twoflag交换所有遇到的2;当i大于zeroflag时,与zeroflag交换所有遇到的0。
注意在每轮内循环的交换的过程中指针i位置保持不变,直到该轮结束i+1。
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note: You are not suppose to use the library’s sort function for this problem.
Follow up: Could you come up with a one-pass algorithm using only constant space?
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意: 不能使用代码库中的排序函数来解决这道题。
进阶:你能想出一个仅使用常数空间的一趟扫描算法吗?
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
/**
*
* Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.
* Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
* You are not suppose to use the library's sort function for this problem.
* Could you come up with a one-pass algorithm using only constant space?
* 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
* 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
* 不能使用代码库中的排序函数来解决这道题。
* 你能想出一个仅使用常数空间的一趟扫描算法吗?
*
*/
public class SortColors {
//三指针法:移动idx,遇到0,交换至zeroflag位置;遇到1,继续前进;遇到2,交换至twoflag位置
public void sortColors(int[] nums) {
int idx = 0;
int zeroflag = 0;
int twoflag = nums.length - 1;
while(idx < twoflag){
if(nums[idx] == 0){
int temp = nums[idx];
nums[idx] = nums[zeroflag];
nums[zeroflag++] = temp;
}
else if(nums[idx] == 2){
int temp = nums[idx];
nums[idx] = nums[twoflag];
nums[twoflag--] = temp;
}
else{
++idx;
}
}
}
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#