一:lintCode 31. 数组划分
题意:
给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:
所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。
python实现:
def partitionArray(self, nums, k):
# write your code here
if not nums: return 0
def partition(nums, k):
key = nums[0]
i, j = 0, len(nums)-1
while i < j:
while i < j and nums[j] >= k: j -= 1 # 所有小于k的元素移到左边
if i >= j: break
nums[i] = nums[j]
i += 1
while i < j and nums[i] < k: i += 1 # 所有大于等于k的元素移到右边
if i >= j: break
nums[j] = nums[i]
j -= 1
nums[i] = key
if nums[i] < k: return i+1 # 支点还是小
return i
return partition(nums, k)
二:lintCode 373. 奇偶分割数组
分割一个整数数组,使得奇数在前偶数在后。
python实现:
def partitionArray(self, nums):
# write your code here
if not nums: return []
i, j = 0, len(nums)-1
key = nums[0]
while i < j:
while i < j and nums[j] % 2 == 0: j -= 1
if i >= j: break
nums[i] = nums[j]
i += 1
while i < j and nums[i] % 2 == 1: i += 1
if i >= j: break
nums[j] = nums[i]
j -= 1
nums[i] = key
lintCode 144. 交错正负数
题意:给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。
实现:
- 注意正负总数不同的情况
- 采用2个游标分别指向偶数下标和奇数下标,交换不符合条件的元素
def rerange(self, A):
# write your code here
tag = 0 # 看正负数的个数, tag > 0, 负数多
for a in A:
if a > 0: tag -= 1
else: tag += 1
if not tag: tag = 1 # tag = 0表示正负数一样多
i = 0
j = 1
while i < len(A) and j < len(A):
while i < len(A) and tag * A[i] < 0: i += 2
while j < len(A) and tag * A[j] > 0: j += 2
if i < len(A) and j < len(A):
A[i], A[j] = A[j], A[i]
i += 2
j += 2
215. Kth Largest Element in an Array
寻找数组中第K大的元素
class Solution(object):
def findKthLargest(self, nums, k):
def partition(nums, left, right): # 从大到小啊
key = nums[left]
while left < right:
while left < right and nums[right] <= key: right -= 1
if left >= right: break
nums[left] = nums[right]
left += 1
while left < right and nums[left] >= key: left += 1
if left >= right: break
nums[right] = nums[left]
right -= 1
nums[left] = key
return left
# 下面就是进行K个划分,第K次的支点就是第K大的数
left, right = 0, len(nums)-1
while True:
pivot = partition(nums, left, right) # pivot的下标,也就是找到第几大的数
if pivot < k-1: # 第k大元素必出现在右子数组
left = pivot + 1
elif pivot > k-1: # 第k大元素必出现在左子数组
right = pivot - 1
else:
return nums[pivot]