划分数组问题

来源:互联网 发布:胖熊数据库微博 编辑:程序博客网 时间:2024/06/08 00:31

今天做了一道题目,是划分数组的问题:

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

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

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

在做这道题的时候,思想十分的简单,就相当于快速排序的partition算法一样,但是唯一不同的是,这个数组的第0的位置nums[0]是有效数字,即给一个数字,让在这个数组里进行划分,和partition方法不一样。

这道题的一个必须注意的地方是边界一定要确定如何处理,是采用low < high,还是low <= high,要考虑清楚

这样的题,一般都是有固定模板的,都是用两个指针,从两头开始处理,最外层是一个while循环,控制程序可以一直执行,在里面每个指针又分别对应一个while循环,这样保证从两头夹逼这个数组,时间复杂度是O(n),关键是边界的确定。

int partitionArray(vector<int> &nums, int k) {
if (nums.size() == 0) return 0;
int low = 0;
int high = nums.size() - 1;
while (low <= high) {
while (low <= high && nums[low] < k) low++;
while (low <= high && nums[high] >= k) high--;
if (low <= high) {
swap(nums[low], nums[high]);
low++;
high--;
}
}
return low;
}


0 0
原创粉丝点击