数据结构基础差,打算开始刷一些leetcode题目练练手,持续记录起来。
题目:删除排序数组中的重复项
初步思路:
两重循环,第一重遍历所有元素,第二重遍历时与第一重的数字对比,重复一次不管,多余一次重复删除。
遇到问题:
每次remove数组中的重复元素后,数组长度变短,会导致数组越界行为,没想到好的解决办法,于是参考。
值得注意:
题目中要求的是原数组nums发生改变,用新的空数组生成会报错。
'''
以下为错误示例:
'''
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
result = []
if len(nums) <= 1:
return 0
else:
nums.sort()
for i in nums:
if i not in result:
result.append(i)
else:
continue
return result
以下为两种正确解法,均能解决我数组越界的疑问:
# 解法1
‘’‘
越界:用到python enumerate()函数,数组角标与值一对一,debug观察del元素后,角标与值对应关系不改变,因此不存在数组越界问题。
思路:设置数组第一位为标志位,从第二位开始对比,相同则删除,不同则将标志位后移,直到全部遍历。
’‘’
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if len(nums) == 0:
return 0
if len(nums) == 1:
return 1
temp = nums[0]
count = 0
for index, num in enumerate(nums[1:]):
if temp == num:
del nums[index - count]
count += 1
else:
temp = num
print(nums)
return len(nums)
# 解法2
‘’‘
越界:看了评论区一个大兄弟的解法,巧妙设置了一个j,保证标志位和pop的位置始终相邻,同样解决了数组越界的问题。
思路:设置数组第一位为标志位,从第二位开始对比,相同则将该元素pop出数组,下次利用j仍比较pop执行后的标志位的相邻位,直到遇到不同元素,则将标志位后移,再重复步骤。
’‘’
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
temp = nums[0]
j = 1
for i in range(1, len(nums)):
i = j
if temp != nums[i]:
temp = nums[i]
j += 1
else:
nums.pop(i)
print(nums)
return len(nums)
基础确实差,学习了,再遇到存在数组越界的问题,会从这两方面考虑解决。