划分数组问题

本文介绍了一个数组划分问题的解决思路及实现代码。该问题要求将一个整数数组按指定值k划分为左右两部分,并返回第一个大于等于k的元素位置。文章详细解释了算法原理,包括使用双指针技术来实现O(n)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

给出一个整数数组 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;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值