文章
36
粉丝
0
获赞
0
访问
3.7k
(1)
由于相同元素一定相邻,可以利用这个特性跳过已知的重复对。设计一个快慢指针策略:
初始化:慢指针 i
从数组起始位置开始(i = 0
),快指针 j
用于探索。
遍历与比较:
让j
从 i
开始,向后移动,直到找到与 nums[i]
不同的元素。此时,j - i
即为 nums[i]
连续出现的次数。如果 nums[i]
只出现了一次(即 j - i == 1
),那么 nums[i]
就是要找的单一元素。如果 nums[i]
出现了两次(即 j - i == 2
),则说明 nums[i]
是重复元素,将 i
移动到 j
的位置(跳过这两个重复元素),继续检查下一个元素。终止条件:当 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)。
空...
登录后发布评论
暂无评论,来抢沙发