最近做了LeetCode上的两道题,题面不难,但是要求实现in-place实现,也就是O(1)的空间复杂度还是需要有点技巧。
LeetCode 75.Sort Colors 要求在O(1)的空间复杂度内one-pass实现数组内的0、1、2的排序。
void sortColors(vector<int>& nums) {
if (nums.size() == 0) return;
int i = -1,j = -1,k = -1;
for (int m = 0; m < nums.size(); ++m) {
if (nums[m] == 0) {
nums[++k] = 2;
nums[++j] = 1;
nums[++i] = 0;
} else if (nums[m] == 1) {
nums[++k] = 2;
nums[++j] = 1;
} else if (nums[m] == 2) {
nums[++k] = 2;
} else break;
}
}
LeetCode 844.Backspace String Compare 实现带有“#”的两个字符串匹配问题,“#”表示将前一个字符删除。
void removeBackspaces(string& str) {
const int size = str.size();
int w = 0;
for (int r = 0; r < size; ++r) {
if (str[r] != '#') {
str[w] = str[r];
++w;
} else {
if (--w < 0) w = 0;
}
}
str.resize(w);
}
bool backspaceCompare(string S, string T) {
removeBackspaces(S);
removeBackspaces(T);
return (S == T);
}
此外还联想到快排中的Partition函数,可以在in-place中实现数组中任意一个元素左边比它小,右边比它大。
int Partition(vector<int>& nums,int l,int r) {
srand (time(NULL));
int index = rand()%(r - l + 1) + l;
cout << nums[index] << endl;
int small = -1;
swap(nums[index],nums[r]);
for (int i = l; i < r; ++i) {
if (nums[i] < nums[r]) {
small++;
if (small != i) swap(nums[small],nums[i]);
}
}
small++;
swap(nums[small],nums[r]);
return small;
}
这三道题提醒我们处理这种题要有in-place和one-pass的思路,精益求精