lintcode-31-数组划分
2017-06-15 18:02
253 查看
数组划分
给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:
所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。
注意事项
你应该真正的划分数组 nums,而不仅仅只是计算比 k 小的整数数,如果数组 nums 中的所有元素都比 k 小,则返回 nums.length。样例
给出数组 nums = [3,2,2,1] 和 k = 2,返回 1.挑战
使用 O(n) 的时间复杂度在数组上进行划分。标签
排序 两根指针 数组简单的思路
先找到划分点,再将小于k的数字放在划分点左边,其他的放在右边,需要空间复杂度O(n)class Solution { public: int partitionArray(vector<int> &nums, int k) { // write your code here int size = nums.size(); if(size < 1) return 0; vector<int> temp = nums; int i= 0, index = 0; for(i=0; i<size; i++) { if(nums[i] < k) { index++; } } int low = 0, high = index; for(i=0; i<size; i++) { if(temp[i] < k) { nums[low] = temp[i]; low++; } else { nums[high] = temp[i]; high++; } } return index; } };
基于快速排序的思想
class Solution { public: int partitionArray(vector<int> &nums, int k) { // write your code here int size = nums.size(); if(size < 1) return 0; int i= 0, index = 0; for(i=0; i<size; i++) { if(nums[i] < k) { int temp = nums[i]; nums[i] = nums[index]; nums[index] = temp; index++; } } return index; } };