文章

36

粉丝

0

获赞

0

访问

3.7k

头像
2025 年 5 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年9月19日 23:24
阅读数 124

 

 (1) 

由于相同元素一定相邻,可以利用这个特性跳过已知的重复对。设计一个快慢指针策略:

  1. ​初始化​:慢指针 i从数组起始位置开始(i = 0),快指针 j用于探索。

  2. ​遍历与比较​:

    ji开始,向后移动,直到找到与 nums[i]不同的元素。此时,j - i即为 nums[i]连续出现的次数。如果 nums[i]只出现了一次(即 j - i == 1),那么 nums[i]就是要找的单一元素。如果 nums[i]出现了两次(即 j - i == 2),则说明 nums[i]是重复元素,将 i移动到 j的位置(跳过这两个重复元素),继续检查下一个元素。
  3. ​终止条件​:当 i移动到数组末尾时,nums[i]就是那个单一元素(因为数组长度是奇数,确保最后会剩下一个)。

(2) 

int findSingleElement(vector<int>& nums) {
    int n = nums.size();
    int i = 0;
    while (i < n) {
        int j = i;
        // 让 j 移动到第一个与 nums[i] 不同的元素位置
        while (j < n && nums[j] == nums[i]) {
            j++;
        }
        // 检查从 i 到 j-1 的连续相同元素个数
        if (j - i == 1) { // 只出现一次
            return nums[i];
        } else { // 出现两次,跳过这两个元素
            i = j;
        }
    }
    return -1; // 根据题意,理论上不会执行到此处
}

 (3)

​时间复杂度为 O(n)​​:慢指针 i每次移动的步长是2(跳过一对重复元素),快指针 j会遍历每个元素。因此,​所有元素最多被访问两次,总的时间复杂度是线性级 O(n)。

​空...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发