题目描述:
给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。
你应该真正的划分数组 nums,而不仅仅只是计算比 k 小的整数数,如果数组 nums 中的所有元素都比 k 小,则返回 nums.length。
样例
给出数组 nums = [3,2,2,1] 和 k = 2,返回 1.
解法1:直接sort排序,然后查找。
解法2:利用快排的思想,小于k的数依次移到前面位置。从p=0位置开始,每次遇见小于k的数都移动到p位置。返回p+1。
附代码:
// 解法2: 利用快排的思想,小于k的数依次移到前面位置
class Solution {
public:
int partitionArray(vector<int> &nums, int k) {
// write your code here
int p = 0;
for (int i=0; i<nums.size(); ++i) {
if (nums[i] < k) {
swap(nums[i], nums[p]);
p++;
}
}
return p;
}
};
解法3:依然是快排的思想,两个指针,l+1表示之前的全是<K的数,r+1表示之前的数全是<K的数。每次交换nums[l+1]和nums[r+1]。
附代码:
// 解法3: 两个指针,l:nums[i+1]>=k nums[i] < k,nums[j]>=k
class Solution {
public:
int partitionArray(vector<int> &nums, int k) {
// write your code here
int l = -1, r = -1;
int n = nums.size();
if (n == 0) return 0;
while(l <= r) {
while(nums[l+1] < k && l < n-1) l += 1;
r = l;
while(nums[r+1] >= k && r < n-1) r += 1;
if (l >= n-1 || r >= n-1) break;
if (nums[l+1] >= k) {
swap(nums[l+1], nums[r+1]);
}
}
if (l >= n) return n;
return l + 1;
}
};
参考链接:
快速排序算法:http://blog.csdn.net/v_july_v/article/details/6116297
原文:http://www.cnblogs.com/icode-girl/p/6336707.html