删除有序数组中的重复项
题目
给你一个 升序排列 的数组 nums
,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums
的第一部分。更规范地说,如果在删除重复项之后有 k
个元素,那么 nums 的前k
个元素应该保存最终结果。
将最终结果插入 nums
的前 k
个位置后返回 k
。
不要使用额外的空间,你必须在原地修改输入数组 并在使用
O
(
1
)
O(1)
O(1) 额外空间的条件下完成。
题目来自:leetcode
解题思路
- 新建一个变量
index
,用来存储非重复元素下标,也就是更新后的数组的下标。 - 首先可以肯定的是第一个元素肯定是可以保留的,所以以
index = 1
开始,然后从i = 1
开始遍历整个数组,当第i
个元素和它前面的元素(i - 1
)不一样的时候,即第i
个元素是一个新的非重复数,可以放到新的数组,即nums[index] = nums[i]
,赋值完成后将index + 1
。 - 最后返回
index
为非重复数的个数,非重复数的下标位0 ~ index - 1
。
图示:以数组int[] {1, 2, 2, 3, 4, 4}
为例。
代码实现
class Solution {
public int removeDuplicates(int[] nums) {
int index = 1;
for(int i = 1; i < nums.length; i++){
if(nums[i] != nums[i - 1]){
nums[index++] = nums[i];
}
}
return index;
}
}
复杂度分析
时间复杂度
O
(
n
)
O(n)
O(n):n 为数组 nums 的长度。
空间复杂度
O
(
1
)
O(1)
O(1)。
移动零
题目
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。题目来自:leetcode
解题思路
删除为0
的元素,将所有非0
元素按原顺序排列好, 剩下的位置补0
。
代码实现
class Solution {
public void moveZeroes(int[] nums) {
// 删除为0的元素,并按照原顺序排列。
int index = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] != 0){
nums[index++] = nums[i];
}
}
// 如果还有剩余的位置,全部补0
if(index < nums.length){
for(int i = index; i < nums.length; i++){
nums[i] = 0;
}
}
}
}
复杂度分析
时间复杂度
O
(
n
)
O(n)
O(n)。
空间复杂度
O
(
1
)
O(1)
O(1)。