其他排序nlogn; O(N)空间复杂度的记录; 就不阐述了。 最优的还是时间复杂度O(N), 空间复杂度O(1)。
这里有个坑,还是不要随便 a, b = b, a交换了。 在带数组的这里,不是同时交换的。
下面的方法就是从左开始,因为本题如果是nums[i] != i, 那么就一直交换,如果相等就继续往下,如果实在没有i这个值,那么其实就是原地不动了,直到交换到 该点本身就是 该点的值。 就return重复的数了~~
nums = [1,2,3,4,5]
nums[1], nums[nums[1]] = nums[nums[1]], nums[1]
print(nums) # [1, 3, 3, 2, 5]
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
if not nums:
return
for i in range(len(nums)):
while nums[i] != i:
res = nums[i]
if nums[res] == nums[i]:
return nums[i]
else:
tmp = nums[nums[i]]
nums[nums[i]] = nums[i]
nums[i] = tmp