题目描述:
给出一个整数数组 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