[LeetCode 26]删除排序数组中的重复项

去除重复元素算法优化
本文通过C语言实现去除有序数组中的重复元素,并逐步优化代码,最终达到最优性能。从最初低效的双层循环到利用数组已排序特性,显著提高了算法效率。

从今天开始除了研究,刷LeetCode,用我会的c、c++、Python三种语言各写一遍,熟悉语言+重温数据结构+联系算法

 

 

 20180903 C语言的第一个版本;216ms;>9.78%

①没有标答的判断数组长度是否为0,但依然可以完成,但是是两层for,效率还可以提高

int removeDuplicates(int* nums, int numsSize) {
    int ifRepeat = 0;
    int len = 0;
    for(int i=0;i<numsSize;i++)
    {
        ifRepeat = 0;
        for(int j=0;j<i;j++)
        {
            if(nums[i]==nums[j])
            {
                ifRepeat = 1;
                break;
            }
        }
        if(!ifRepeat)
        {
            nums[len] = nums[i];
            len++;
            
        }        
    }
    return len;
}

20180907 C Language Version 2.0;12ms;>87.49%

①最初的代码因为没有考虑到题目中的排序数组条件,所以进行了两遍循环,效率比较低下

②这里用到了排序的条件,大幅提升,结构就和标答类似了

int removeDuplicates(int* nums, int numsSize) {
    int len = 0;
    if (numsSize == 0) return 0;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]!=nums[len])
        {
            len++;
            nums[len] = nums[i]; 
        }
                           
    }
    return len+1;
}

20180907 C Language Version 3.0;8ms;>100%

①参考了最快的代码,,格式上也修改的更加紧凑,几点学习:

(1)直接定义循环变量,不要在循环中定义,这样减少了内存分配的时间,提高速度

(2)一些判断应当写在开头,

(3)++符号的计算速度是很快的,应该紧密使用

int removeDuplicates(int* nums, int numsSize) {
    int len = 0,i;
    if (numsSize == 0) return 0;
    for( i=1;i<numsSize;i++)
        if(nums[i]!=nums[len])
            nums[++len] = nums[i]; 
    return len+1;
}

20180907 C++;24ms;>95.40%

①用一个独立变量存储nums.size(),减少调用,提高速度

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int size = nums.size();
        int len = 0,i;
        if(size == 0) return 0;
        for(i=1;i<size;i++)
            if(nums[i]!=nums[len])
                nums[++len] = nums[i];
        return ++len;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值