LintCode31 partitionArray 数组划分

给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:

所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。

  1. 注意事项
    你应该真正的划分数组 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;
    }
}
发布了54 篇原创文章 · 获赞 2 · 访问量 713

猜你喜欢

转载自blog.csdn.net/qq_40647378/article/details/104057514