news 2026/8/17 21:40:33

C语言二分查找题解:有序数组中找只出现一次的元素——O(log n)时间O(1)空间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言二分查找题解:有序数组中找只出现一次的元素——O(log n)时间O(1)空间

问题描述

小U最近在学习数组操作,他遇到了一个有趣的问题:给定一个已按非递减顺序排列的整数数组nums,其中除了一个元素只出现一次外,其他所有元素都恰好出现两次,并且相同元素总是相邻出现。小U需要设计一个算法,在 O(log n) 时间复杂度内找到这个只出现一次的元素,并且只能使用常数额外空间。你能帮助小U解决这个问题吗?

要求:

  1. 算法的时间复杂度必须为 O(log n),其中 n 是数组nums的长度。
  2. 只能使用常数额外空间,不能使用线性扫描或哈希表等需要额外 O(n) 空间的方法。

测试样例

样例1:

输入:nums = [1, 1, 2, 3, 3, 4, 4, 8, 8]输出:2解释:数字 2 只出现一次,其余数字都恰好出现两次且相邻出现。

样例2:

输入:nums = [3, 3, 7, 7, 10, 11, 11]输出:10解释:10 是数组中唯一一个不重复的数字,其他数字都成对相邻出现。

样例3:

输入:nums = [1, 1, 2, 2, 3, 4, 4]输出:3解释:数字 3 只出现一次,是独特的元素,其他数字都成对相邻出现。

约束条件

  • 1 ≤ nums.length ≤ 10^5
  • 0 ≤ nums[i] ≤ 10^5
  • 数组nums已按非递减顺序排序
  • 除了一个元素只出现一次外,其他所有元素都恰好出现两次
  • 相同元素总是相邻出现(即数组的排列模式为:[a, a, b, b, c, c, ..., x, ...])
  • 数组长度一定是奇数(因为 2n + 1)

程序代码

#include <stdio.h>

int singleNonDuplicate(int* nums, int numsSize) {

int left = 0, right = numsSize - 1;

while (left < right) {

int mid = left + (right - left) / 2;

// 保证 mid 在偶数位置,便于与下一个比较

if (mid % 2 == 1) {

mid--;

}

// 如果 mid 和 mid+1 相等,说明成对正常,独特元素在右侧

if (nums[mid] == nums[mid + 1]) {

left = mid + 2;

} else {

// 否则独特元素在左侧(包含 mid)

right = mid;

}

}

return nums[left];

}

int main() {

int nums1[] = {1, 1, 2, 3, 3, 4, 4, 8, 8};

int nums2[] = {3, 3, 7, 7, 10, 11, 11};

int nums3[] = {1, 1, 2, 2, 3, 4, 4};

printf("%d\n", singleNonDuplicate(nums1, 9));

printf("%d\n", singleNonDuplicate(nums2, 7));

printf("%d\n", singleNonDuplicate(nums3, 7));

return 0;

}

#include <stdio.h> int singleNonDuplicate(int* nums, int numsSize) { int left = 0, right = numsSize - 1; while (left < right) { int mid = left + (right - left) / 2; // 保证 mid 在偶数位置,便于与下一个比较 if (mid % 2 == 1) { mid--; } // 如果 mid 和 mid+1 相等,说明成对正常,独特元素在右侧 if (nums[mid] == nums[mid + 1]) { left = mid + 2; } else { // 否则独特元素在左侧(包含 mid) right = mid; } } return nums[left]; } int main() { int nums1[] = {1, 1, 2, 3, 3, 4, 4, 8, 8}; int nums2[] = {3, 3, 7, 7, 10, 11, 11}; int nums3[] = {1, 1, 2, 2, 3, 4, 4}; printf("%d\n", singleNonDuplicate(nums1, 9)); printf("%d\n", singleNonDuplicate(nums2, 7)); printf("%d\n", singleNonDuplicate(nums3, 7)); return 0; }

运行结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 21:38:44

SpecAugment四大增强策略解析:LB/LD/SM/SS配置对比与选择指南

SpecAugment四大增强策略解析&#xff1a;LB/LD/SM/SS配置对比与选择指南 【免费下载链接】SpecAugment A Implementation of SpecAugment with Tensorflow & Pytorch, introduced by Google Brain 项目地址: https://gitcode.com/gh_mirrors/spe/SpecAugment SpecA…

作者头像 李华
网站建设 2026/8/17 21:36:35

开源小模型本地部署实战:从硬件选型到API集成全指南

这次我们来看一个趋势性的技术话题&#xff1a;开源小模型正在加速逼近大模型的能力边界&#xff0c;AI发展的重心可能正在发生快速转移。对于开发者、研究者和企业技术团队来说&#xff0c;这不再是一个遥远的概念&#xff0c;而是直接影响技术选型、硬件投入和产品落地的现实…

作者头像 李华
网站建设 2026/8/17 21:36:23

捷途新能源战略转型:从“旅行+”到“旅行+新能源”的路径与挑战

1. 从“旅行”到“旅行新能源”&#xff1a;捷途的战略转身 最近&#xff0c;捷途汽车公布了其未来的产品规划&#xff0c;核心信息很明确&#xff1a;要推出新能源车型了。这消息一出&#xff0c;在圈内和关注它的用户群里&#xff0c;激起的讨论不小。毕竟&#xff0c;捷途这…

作者头像 李华
网站建设 2026/8/17 21:35:36

c语言编码规范

一、前言 1、在公司做项目时&#xff0c;使用公司的 C 语言编码规范即可。 2、如果公司没有编码规范&#xff0c;可以参考下面的编码规范&#xff0c;避免变量满天飞、代码混乱等问题&#xff0c;形成良好的编码习惯。 3、个人在私下进行学习时&#xff0c;也可以参考下面的编码…

作者头像 李华