题目:partitionArray
要求:
给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:
所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。
样例:
给出数组 nums = [3,2,2,1] 和 k = 2,返回 1.
算法要求:
使用 O(n) 的时间复杂度在数组上进行划分。
解题思路:
用二个指针一个从前面一个从后面进行选择交换即可。
最后交换完,查找k的位置。
注意其实结果就是输出比k小的有几个,但是不要这么写,按题意写即可。
算法如下:
int partitionArray(vector<int> &nums, int k) {
// write your code here
int size = nums.size();
int i = 0;
int j = size - 1;
while (i <= j) {
while (nums[i] < k && i < size) {
i++;
}
while (nums[j] >= k && j >= 0) {
j--;
}
if (i > j) {
break;
}
swap(nums[i], nums[j]);
i++;
j--;
}
i = 0;
while (i < size) {
if (nums[i] >= k) {
break;
}
i++;
}
return i;
}