问题描述如下:
/*
* 思路:二重循环,将第一个数和数组中的其他数进行比较
* 如果遇到相同的即将其删除
* 注意:删除后,二重循环的j需要自减,因为相同的数已经被下一个数替代,而位置没变
* 缺点:时间复杂度真的很大。。。
*/
class Solution {
public int removeDuplicates(int[] nums) {
int size = nums.length -1;
for(int i=0;i<size;i++){
for(int j=i+1;j<size+1;j++){
if(nums[i]==nums[j]){
for(int k=j;k<size;k++){
nums[k]=nums[k+1];
}
j--;
size--;
}
}
}
return size+1;
}
}
官网给出的方法是双指针法,即:
①数组完成排序后,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。
②只要 nums[i] = nums[j],我们就增加 j 以跳过重复项。
③当我们遇到 nums[j] ≠ nums[i]时,跳过重复项的运行已经结束,因此我们必须把它(nums[j])的值复制到 nums[i+1]。
④然后递增 i,接着我们将再次重复相同的过程,直到 j 到达数组的末尾为止。
理由:题目中给的是排序序列
代码如下:
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
nums[++i] = nums[j];
}
}
return i + 1;
}
第二个解法的执行时间比以一种真的短太多了!!!