题目描述
题目1: 找出数组中重复的数字
在一个长度为n的数组中,所有的数字都在0-n-1的范围内。数组中某些数字是重复的
,但是不知道有几个数字是重复了,也不知道每个数组重复了几次,请找出数组中任意一个重复的数字
import copy
class Solution():
def find_duplicate_1(self, nums):
"""
1. 使用快速排序
2.遍历一遍
:param nums:
:return:
"""
def quick_partition(array, start, end):
if start >= end:
# 如果start和end相等了,说明数组中只有一个数字,就不用进行排序了,直接跳出
return
base = array[start]
low = start
high = end
while low < high:
while low < high and array[high] > base:
high -= 1
array[low] = array[high]
while low < high and array[low] <= base:
low += 1
array[high] = array[low]
array[low] = base
quick_partition(array, start, low-1)
quick_partition(array, low+1, end)
return array
sorted_array = quick_partition(nums, 0, len(nums)-1)
ans = []
i = 0
while i < len(sorted_array) - 1:
if sorted_array[i] == sorted_array[i+1]:
ans.append(sorted_array[i])
i += 1
i += 1
return ans
def find_duplicate_2(self, nums):
"""
时间复杂度O(n)
空间复杂度O(n), 一个长度为N的hash表
:param nums:
:return:
"""
d = dict()
ans = []
for ele in nums:
if ele in d.keys():
ans.append(ele)
else:
d.setdefault(ele, 0)
return ans
def find_duplicate_3(self, nums):
"""
数字都在0-n-1的范围内,如果数组中没有重复的数字,第i个位置将出现为i,否则进行交换
:param nums:
:return:
"""
import time
if not nums:
return None
n = len(nums)
i= 0
ans = []
print(nums)
while i < n:
while nums[i] != i:
if nums[i] != nums[nums[i]]:
# 注意这个大坑啊,
# nums[i], nums[nums[i]] = nums[nums[i]], nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
else:
ans.append(nums[i])
break
i += 1
return ans
if __name__ == '__main__':
test_case = [2, 3, 1, 0, 2, 5, 3]
ss = Solution()
print(ss.find_duplicate_1(test_case))
print(ss.find_duplicate_2(test_case))
print(ss.find_duplicate_3([2, 3, 1, 0, 2, 5, 3]))
python 交换操作引发的血案
其中在操作:
nums[i], nums[nums[i]] = nums[nums[i]], nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
这两个操作结果不一样。