# #31 Partition Array

45人阅读 评论(0)

Given an array nums of integers and an int k, partition the array (i.e move the elements in "nums") such that:

• All elements < k are moved to the left
• All elements >= k are moved to the right

Return the partitioning index, i.e the first index i nums[i] >= k.

##### Notice

You should do really partition in array nums instead of just counting the numbers of integers smaller than k.

If all elements in nums are smaller than k, then return nums.length

Example

If nums = [3,2,2,1] and k=2, a valid answer is 1.

Challenge

Can you partition the array in-place and in O(n)?

Mycode（AC = 13ms）：

class Solution {
public:
int partitionArray(vector<int> &nums, int k) {
if (nums.size() == 0) return 0;

int l = 0, r = nums.size() - 1;
for (int i = 0; i <= r; i++) {
// swap left and index if nums[i] < k
if (nums[i] < k) {
swap(nums, i, l);
l++;
}
// swap right and index if nums[i] < k
else {
swap(nums, i, r);
// it is possible that the original
// nums[r] is smaller than k, in that
// case, should do another swap between
// l and old i
if (nums[i] < k) i--;
r--;
}
}

return l;
}

void swap(vector<int> &nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
};

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：12477次
• 积分：2244
• 等级：
• 排名：第16813名
• 原创：221篇
• 转载：1篇
• 译文：0篇
• 评论：10条
文章分类
文章存档
阅读排行
评论排行