给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:
- 所有小于k的元素移到左边
- 所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。
样例
给出数组 nums = [3,2,2,1]
和 k = 2
,返回 1
.
挑战
使用 O(n) 的时间复杂度在数组上进行划分。
解题思路:
类似于快速排序的partition操作。
public class Solution {
/**
* @param nums: The integer array you should partition
* @param k: An integer
* @return: The index after partition
*/
public int partitionArray(int[] nums, int k) {
// 维持性质[0, j) < k , [j, i) >= k, i为遍历元素
int j = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] < k){
swap(nums, i, j);
j++;
}
}
return j;
}
private void swap(int[] nums, int i, int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}