|
发表于 2023-9-26 13:20:09
|
显示全部楼层
这段代码的算法思路是双指针,即用 i 指针指向当前元素,j 指针指向下一个元素,如果发现相同的元素就返回 true,否则 j 指针向后移动。如果 j 指针到达数组末尾,则 i 指针向后移动一位,j 指针指向 i+1 位置。这个思路本质上是暴力搜索,时间复杂度是 O(n^2)。
这段代码的问题在于没有考虑到数组中元素可能为负数的情况,因此需要在比较元素是否相同之前先将数组排序,否则会出现错误的结果。
正确的代码应该是这样的:
- bool containsDuplicate(int* nums, int numsSize){
- if (numsSize < 2) {
- return false;
- }
- // 先将数组排序
- qsort(nums, numsSize, sizeof(int), cmp);
- for (int i = 1; i < numsSize; i++) {
- if (nums[ i] == nums[i-1]) {
- return true;
- }
- }
- return false;
- }
- int cmp(const void *a, const void *b) {
- return (*(int*)a - *(int*)b);
- }
复制代码
这段代码的时间复杂度为 O(nlogn),因为排序的时间复杂度是 O(nlogn)。 |
|