描述
给出一个整数数组 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) 的时间复杂度在数组上进行划分。
OK.本题的算法说白了还是两个指针上的操作,与快排的思想很类似。先在左边找到大于K的值,再在右边找到小于K的值,然后交换他们。不过这一题跟快排的不一样在于当end–的时候,while中的判断有等号。
代码如下:
- class Solution:
- """
- @param nums: The integer array you should partition
- @param k: An integer
- @return: The index after partition
- """
- def partitionArray(self, nums, k):
- # write your code here
- if(nums==None or len(nums)==0):return 0
- start,end=0,len(nums)-1
- while(start<end):
- while(start<end and nums[end]>=k):
- end-=1
- while(start<end and nums[start]<k):
- start+=1
- if(nums[start]>=k and nums[end]<k):
- temp=nums[start]
- nums[start]=nums[end]
- nums[end]=temp
- start+=1
- end-=1
- print(nums)
- if(nums[start]<k):
- return start+1
- else:return start
-
-
-
- s = Solution()
- print(s.partitionArray([9,9,9,8,9,8,7,9,8,8,8,9,8,9,8,8,6,9],9))