##觉得自己太菜了又去刷题去了,昨天做到一个很简单的题,删除一个数组里的重复项,只能在本数组里修改。
没想太多,按照逻辑写了一个,然后过了,发现时间复杂度太高..看了题解学习到了可以设置两个指针,一个快指针,一个慢指针。先贴上自己的写法:
class Solution {
public int removeDuplicates(int[] nums) {
int i,j;
int len=nums.length;
if(len==1){
return 0;
}
for(i=0;i<len;i++){
if(i+1>len-1){
len--;break;
}
if(nums[i]==nums[i+1]){
j=i;
for(;j<len-1;j++){
nums[j]=nums[j+1];
}
len--;
i--;
}
}
return len+1;
}
}
思想:从数组的第一个数开始判断,如果他跟后面的一个数相同,后面的数依次向前挪一位,而且i回退一步。回退是因为如果三个连续的数会错过,所以i必须回退,这样的时间复杂度就是o(n2)了。
先贴出题解:
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]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
思想:i是慢指针,j是快指针,i从0开始,记录每一个不相同的数,重新构造一个数组,j从1开始,扫描整个数组,只要发现不相同的,就把nums[i]的值置为nums[j].这样下来时间复杂度只有o(n).
学到了。
##又见到一题可以用这个双指针的,补充一下:
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
其实就是判定重复
我的思路是先排序,让他们有序。然后重复的都会在前后了,然后用双指针,一个在前,一个在后,判断两个是不是一样,一样就break,不一样就继续循环,最后在结束的时候,判断i==nums.length,就是判断循环有没有执行完。
class Solution {
public boolean containsDuplicate(int[] nums) {
int i,j=0;
if(nums.length<=1) return false;
Arrays.sort(nums);
for(i=1;i<nums.length;i++){
if(nums[j]!=nums[i]) j++;
else break;
}
if(i==nums.length) return false;
else return true;
}
}