前言:从20题之后就没再按照顺序来做了,准备先把初级算法先写完。
一、题目原型:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
二、题目意思剖析:
1 | 给定数组 nums = [1,1,2], |
三、解题思路:
想到的第一种办法是用两个变量来分别控制,resultCount:数组最终元素个数,n:和i两个指针间,形成一个滑动窗口关系。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26func removeDuplicates(_ nums: inout [Int]) -> Int {
if nums.count == 0 {
return 0
}
var n: Int = 0
var resultCount: Int = nums.count
for i in 0..<nums.count-1 {
if nums[i] == nums[i+1] {
resultCount = resultCount - 1
n = n + 1
// i = 4 n = 3
}else {
// i = 3 n = 3
// i = 5 n = 4
nums[i - n + 1] = nums[i+1]
}
print("i=\(i) n=\(n)")
}
// [1,1,1,1,2,2,11]
// [1,2,11,1,1,1,2]
// 4 -> 1
// 6 -> 2
// 出现多少次n 就用最后的i - n + 1
print(nums)
return resultCount
}
然后,发现,其实用nums[i] != nums[k]来判断显得更为简洁和直观。而且还少了一个变量的空间。
1 | func removeDuplicates(_ nums: inout [Int]) -> Int { |
注:题中的使用 O(1) 额外空间的条件下完成,固定多少的变量下其实也是O(1),并不是说只能用一个额外的变量。
四、小结
耗时44
毫秒,超过50.28%
的提交记录,总提交数161
。