存在重复

    xiaoxiao2023-10-14  171

    题:若函数中有重复的元素则返回true,反之则返回false;

    例:示例 1: 输入: [1,2,3,1] 输出: true 示例 2: 输入: [1,2,3,4] 输出: false 示例 3: 输入: [1,1,1,3,3,4,3,2,4,2] 输出: true

    思路:这道题是不是看起来觉得很简单?运用两个循环就OK对吧?我起初也是这么想的,O(n^2)的复杂度在我看来并不算高,但若输入10000个元素呢?O(n ^2)的复杂度就很可怕了,我将对算法做出一定优化。

    优化思路: 分三种情况: (1)、只有一个元素:则直接返回false; (2)、元素个数在100个以内:就用两个循环进行嵌套,以O(n^2)的复杂度进行; (3)、元素个数大于100个:新创建一个数组并全部置零,若第i个元素为正数s,则给新数组的第s个位置加1,在循环赋值的过程中,需要在某个位置加1时,若这个位置已经为1或3(3=1+2,说明这个地方有绝对值相等的正负数)时就返回true;若第i个元素s为负,则给新数组的第s个位置加2,在循环赋值的过程中,需要在某个位置加2时,若这个位置已经为2或3(3=1+2,说明这个地方有绝对值相等的正负数),时就返回true。 优化后复杂度为O(n)。

    C语言代码实现:

    bool containsDuplicate(int* nums, int numsSize) { int i, z, j, flag = 0; int numss[1000000] = { 0 }; if (numsSize < 2) return false; if(numsSize<100) { for (i = 0; i < numsSize - 1; i++) { for (j = i + 1; j < numsSize; j++) { if (nums[i] == nums[j]) return true; } } return false; } for (i = 0; i < numsSize; i++) { j = fabs(nums[i]); z = nums[i]; if (z > 0) { if ((numss[j] == 1) || (numss[j] == 3)) return true; else { flag = 1; numss[j] += flag; flag = 0; } } else { if ((numss[j] == 2) || numss[j] == 3) return true; else { flag = 2; numss[j] += flag; flag = 0; } } } return false; }
    最新回复(0)