从今天开始除了研究,刷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;
}
};