您的位置:首页 > 其它

LintCode 数组划分

2015-10-03 21:06 316 查看
数组划分

给出一个整数数组nums和一个整数k。划分数组(即移动数组nums中的元素),使得:

所有小于k的元素移到左边

所有大于等于k的元素移到右边

返回数组划分的位置,即数组中第一个位置i,满足nums[i]大于等于k。

样例

给出数组nums=[3,2,2,1]和 k=2,返回 1

注意

你应该真正的划分数组nums,而不仅仅只是计算比k小的整数数,如果数组nums中的所有元素都比k小,则返回nums.length。

挑战

要求在原地使用O(n)的时间复杂度来划分数组

solution:

方法一:一种比较简单直接的方法就是相对nums排序,然后查找第一个大于等于K的元素的索引

class Solution {
public:
int partitionArray(vector<int> &nums, int k) {
// write your code here
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] >= k)
return i;
}
return nums.size();
}
};


方法二:保持两个前后索引 i 和 j , 其中 i <= j, nums[i] < k and nums[j] >= k; 否则就交换这个元素

class Solution {
public:
int partitionArray(vector<int> &nums, int k) {
// write your code here
int i = 0, j = nums.size()-1;
while (i <= j) {
while(i <= j && nums[i] < k) ++i;
while(i <= j && nums[j] >= k) --j;

if (i <= j) {
swap(nums[i], nums[j]);
++i; --j;
}
}
return i;
}
private :
inline void swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: