具体地,我们使用与方法二相同的哈希映射,并且使用一个额外的队列,按照顺序存储每一个字符以及它们第一次出现的位置。当我们对字符串进行遍历时,设当前遍历到的字符为 cc,如果 cc 不在哈希映射中,我们就将 cc 与它的索引作为一个二元组放入队尾,否则我们就需要检查队列中的元素是否都满足「只出现一次」的要求,即我们不断地根据哈希映射中存储的值(是否为 -1−1)选择弹出队首的元素,直到队首元素「真的」只出现了一次或者队列为空。
classSolution { public: vector<int> sortArray(vector<int>& nums){ sort(nums, 0, nums.size() - 1); return nums; } private: intpatition(vector<int>& nums, int i, int j) { int pivot = rand() % (j - i + 1) + i; int c = nums[pivot]; swap(nums[pivot], nums[i]); int lo = i, hi = j + 1; while(lo < hi) { while(lo < j && nums[++lo] < c) {} while(hi > i && nums[--hi] > c) {} if(lo >= hi) break; swap(nums[lo], nums[hi]); } swap(nums[hi], nums[i]); return hi; } voidsort(vector<int>& nums, int i, int j) { if(i >= j) return; int m = patition(nums, i, j); sort(nums, i, m - 1); sort(nums, m + 1, j); } };