给出一个整数数组 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;
}
}
本文介绍了一种在O(n)时间复杂度下对整数数组进行划分的算法,该算法能够将所有小于给定值k的元素移至数组左侧,而所有大于等于k的元素移至右侧,并返回第一个大于等于k的元素的位置。
474

被折叠的 条评论
为什么被折叠?



