给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:
所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。
- 注意事项
你应该真正的划分数组 nums,而不仅仅只是计算比 k 小的整数数,如果数组 nums 中的所有元素都比 k 小,则返回 nums.length。
样例
给出数组 nums = [3,2,2,1] 和 k = 2,返回 1.
挑战
使用 O(n) 的时间复杂度在数组上进行划分。
概念理解
只要l,r 都动过,l停的位置就是first index that nums[i] >= k, 一般情况return l就好了
单独讨论l或者r没有动过的情况,l没有动过的情况还是return l, r没有动过的情况return r+1
九章的做法
最后会停留在left=right的位置
public class Solution{
public int partitionArray(int[] nums,int k){
if(nums==null||nums.length==0){
return -1;
}
int left=0,right=nums.length-1;//这个注意是个小的逗号
while(left<right){
while(left<right&&nums[left]<k){
left++;
}
while(left<right&&nums[right]>=k){
right--;
}
if(left<right){
int temp=nums[right];
nums[left]=nums[right];
nums[right]=temp;
left++;
right--;
}
}
if(nums[left]<k){
return left+1;//也是可以理解 这个一个没动
}
//否则
return left;
}
}
参考其他博主
public class Solution {
/**
*@param nums: The integer array you should partition
*@param k: As description
*return: The index after partition
*/
public int partitionArray(int[] nums, int k) {
//write your code here
if (nums==null || nums.length==0) return 0;
int l=0, r=nums.length-1;
while (true) {
while (l<r && nums[l]<k) {
l++;
}
while (l<r && nums[r]>=k) {
r--;
}
if (l == r) break;
swap(l, r, nums);
}
//if (l==0 && nums[l]>=k) return l;
if (r==nums.length-1 && nums[r]<k){
return r+1;
}
return l;
}
public void swap(int l, int r, int[] nums) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
}