题目
描述
给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:
所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。
背完这套刷题模板,真的不一样!
北大学霸令狐冲15年刷题经验总结的《算法小抄模板Cheat Sheet》助你上岸!
微信添加【jiuzhang0607】备注【小抄】领取
如果数组所有数都大于 k ,则应该返回 nums.length
0 <= nums.length <= 20000<=nums.length<=2000
样例
样例 1:
输入:
nums = []
k = 9
输出:
0
解释:
空数组,输出0
样例 2:
输入:
nums = [3,2,2,1]
k = 2
输出:
1
解释:
真实的数组为[1,2,2,3].所以返回 1
挑战
使用 O(n)O(n) 的时间复杂度在数组上进行划分。
方法1:快速选择
public int partitionArray(int[] nums, int k) {
int l = 0, r = nums.length - 1;
while (l <= r) {
while (l <= r && nums[l] < k) {
l++;
}
while (l <= r && nums[r] >= k) {
r--;
}
if (l < r) {
int t = nums[l];
nums[l] = nums[r];
nums[r] = t;
l++;
r--;
}
}
return l;
}