2026-10-03:唯一中间元素。用go语言,给定一个元素个数为奇数的整数序列。先找到序列正中间位置上的那个元素,再统计这个元素的值在整个序列中出现了多少次。如果它的出现次数正好是一次,就返回真;否则返回假。
1 <= n == nums.length <= 100。
n 是奇数。
1 <= nums[i] <= 100。
输入: nums = [1,2,3]。
输出: true。
解释:
nums 的中间元素是 2 ,它恰好出现一次。
因此,答案为 true 。
题目来自力扣3978。
大体步骤如下:
首先接收一个整数序列
nums。题目保证这个序列的长度是奇数,所以序列一定有一个明确的正中间位置。计算这个正中间位置的下标。因为长度是奇数,所以用总长度除以 2 并向下取整,就能得到中间下标。例如长度为 3 时,中间下标是 1;长度为 5 时,中间下标是 2。
根据中间下标,从序列中取出正中间的那个元素的值,记为“中间值”。
接下来要判断这个“中间值”是否在整个序列中只出现一次。判断方式是分别检查中间位置的左边部分和右边部分。
先看左半部分:左半部分是从序列开头到中间位置之前的所有元素。程序会遍历这些元素,逐个与“中间值”比较。只要发现有一个元素等于“中间值”,就说明中间值在左边也出现过,因此它不只出现一次,函数直接返回假。
如果左半部分没有找到相同的值,再检查右半部分:右半部分是从中间位置之后到序列末尾的所有元素。同样逐个与“中间值”比较。只要发现有一个元素等于“中间值”,就说明中间值在右边也出现过,函数直接返回假。
如果左半部分和右半部分都没有出现与“中间值”相同的元素,说明这个中间值在整个序列中只出现在正中间那一个位置,也就是恰好出现一次,函数返回真。
对于题目给出的输入
[1, 2, 3]:- 序列长度为 3,中间下标为 1。
- 中间值是
nums[1],也就是 2。 - 左半部分是
[1],里面没有 2。 - 右半部分是
[3],里面也没有 2。 - 因此 2 在整个序列中只出现一次,结果为真,最终输出
true。
主程序调用这个判断函数,并打印返回的结果。
时间复杂度分析:
程序需要检查左半部分和右半部分,左半部分最多有大约 n/2 个元素,右半部分最多也有大约 n/2 个元素,合起来最多检查 n-1 个元素。因此总的时间复杂度是 O(n),其中 n 是序列长度。
额外空间复杂度分析:
程序只使用了几个变量来保存中间下标、中间值以及判断结果,没有创建与输入规模成比例的额外数组或数据结构。因此总的额外空间复杂度是 O(1)。
Go完整代码如下:
packagemainimport("fmt""slices")funcisMiddleElementUnique(nums[]int)bool{m:=len(nums)/2return!slices.Contains(nums[:m],nums[m])&&!slices.Contains(nums[m+1:],nums[m])}funcmain(){nums:=[]int{1,2,3}result:=isMiddleElementUnique(nums)fmt.Println(result)}Python完整代码如下:
# -*-coding:utf-8-*-defis_middle_element_unique(nums:list[int])->bool:m=len(nums)//2mid=nums[m]returnmidnotinnums[:m]andmidnotinnums[m+1:]defmain():nums=[1,2,3]result=is_middle_element_unique(nums)print(result)if__name__=="__main__":main()C++完整代码如下:
#include<iostream>#include<vector>#include<algorithm>boolisMiddleElementUnique(conststd::vector<int>&nums){std::size_t m=nums.size()/2;intmid=nums[m];returnstd::find(nums.begin(),nums.begin()+m,mid)==nums.begin()+m&&std::find(nums.begin()+m+1,nums.end(),mid)==nums.end();}intmain(){std::vector<int>nums={1,2,3};boolresult=isMiddleElementUnique(nums);std::cout<<std::boolalpha<<result<<std::endl;return0;}