题目描述:

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

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

返回数组划分的位置,即数组中第一个位置 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

posted on 2017-01-21 11:29  小小八  阅读(741)  评论(0编辑  收藏  举报