leetcode26 删除排序数组中的重复项之数组的快慢双指针

##觉得自己太菜了又去刷题去了,昨天做到一个很简单的题,删除一个数组里的重复项,只能在本数组里修改。

题目

没想太多,按照逻辑写了一个,然后过了,发现时间复杂度太高..看了题解学习到了可以设置两个指针,一个快指针,一个慢指针。先贴上自己的写法:

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;
        
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值