条件:给你一个无序数组 nums ,请你 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
例1:给定一个数组nums为[1,4,3,2,1],去掉重复元素应该返回4
输入:nums = [0,0,1,1,2]
输出:3, nums = [0,1,2]
解释:函数应该返回新的长度 3 ,并且原数组 nums 的前两个元素被修改为 0,1, 2 。不需要考虑数组中超出新长度后面的元素。
例2:
输入:nums = [1,4,3,2,1]
输出:4, nums = [1,2,3,4]
解释:函数应该返回新的长度 4 ,并且原数组 nums 的前两个元素被修改为 1,2,3,4 。不需要考虑数组中超出新长度后面的元素。
1)数组排序再遍历数组,取出不同的数字存储在临时数组中,最后将临时数组赋值给原数组,即为所求
//MARK:- 删除重复项
funccheckRemoveDuplicates(_nums:inout[Int]) ->Int{
ifnums.count==0{
return0
}
nums = nums.sorted()
varcurrent :Int= nums[0]
//存储不同的数字
varidx : [Int] = [current]
// 遍历
foriin1..<nums.count{
ifcurrent==nums[i] {
continue
}else{
idx.append(nums[i])
current = nums[i]
}
}
nums = idx
print(nums)
return nums.underestimatedCount
}
2)双指针法,符合题目要求
先数组排序后,定义连个指针 i 和 j ,其中 i 是慢指针,代表数组中连续不重复的数字的下标,j是快指针,代表原数组的下标,遍历数组,只要 nums[i] = nums[j] , 就增加 j 跳过重复的数字,当 nums[i] != nums[j] 时,就把num[j]的值赋值到num[i+1]中,然后i递增,依次重复上述过程至数组达到末尾
//MARK:- 删除重复项
funccheckRemoveDuplicates(_nums:inout[Int]) ->Int{
ifnums.count==0{
return0
}
nums = nums.sorted()
//慢指针,代表不同数组的下标
vari =0
//j为快指针
forjin1..<nums.count{
ifnums[j]!=nums[i] {
i+=1
nums[i] = nums[j]
}
}
print(nums[0...i])
returni+1
}
3)时间复杂度:O(n)
备注:因为数组是排序的,只要是相同的肯定是挨着的,我们只需要遍历所有数组,然后前后两两比较,如果有相同的就把后面的给删除。
网友评论