首页 > 试题广场 >

有序数组中出现一次的元素

[编程题]有序数组中出现一次的元素
  • 热度指数:824 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的有序数组,其中每个元素都出现两次,只有一个数仅出现一次。请你找出这个数。
你能在O(logn)的时间复杂度和O(1)的 空间复杂度下完成本题吗

数据范围:数组长度 ,数组中每个元素的值满足
示例1

输入

[1,2,2,3,3]

输出

1
示例2

输入

[1,1,5,5,8,8,9,10,10]

输出

9
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param v int整型一维数组
# @return int整型
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/4c67fc80c37649ac906fee76ec82beb4?tpId=196&tqId=40508&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D8%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=undefined&tags=&title=
    算法:
        left, right = 0, len(v) - 1
        当left < right时,二分查找res:
            mid = left + (right - left) / 2
            如果v[mid] != v[left] and v[mid] != v[right]:
                return v[mid]
            否则,如果v[mid] == v[mid - 1]:
                    若(mid + 1) % 2 == 0: # 解在区间[mid + 1, right]
                        left = mid + 1
                    否则:
                        right = mid - 2
            否则: #  v[mid] == v[mid + 1]
                若mid % 2 == 0:# 解在区间[mid + 2, right]
                    left = mid + 2
                否则:
                    right = mid - 1
    复杂度:
        时间复杂度:O(logN)
        空间复杂度:O(1)
    """

    def singleElement(self, v):
        # write code here
        left, right = 0, len(v) - 1

        while left < right:
            mid = left + (right - left) / 2
            if v[mid] != v[mid - 1] and v[mid] != v[mid + 1]:
                return v[mid]
            elif v[mid] == v[mid - 1]:
                if (mid + 1) % 2 == 0:  # 解在区间[mid + 1, right]
                    left = mid + 1
                else:
                    right = mid - 2
            else:  # v[mid] == v[mid + 1]
                if mid % 2 == 0:  # 解在区间[mid + 2, right]
                    left = mid + 2
                else:
                    right = mid - 1

        return v[left]


if __name__ == "__main__":
    sol = Solution()

    # nums = [1, 2, 2, 3, 3]

    # nums = [1, 1, 5, 5, 8, 8, 9, 10, 10]

    nums = [5, 5, 6, 6, 9, 10, 10, 11, 11, 13, 13, 14, 14]

    res = sol.singleElement(nums)

    print res

发表于 2022-06-23 16:12:53 回复(0)
class Solution {
public:
    int singleElement(vector<int>& v) {
     
        int i=0,j=v.size()-1;
        while(i<j){
            int mid=(j-i)/2+i;
            if(v[mid]==v[mid^1]){
                i=mid+1;
            }else{
                j=mid;
            }
        }
        return v[i];
    }
};

发表于 2022-06-23 09:50:01 回复(0)
class Solution {
public:
    int singleElement(vector<int>& v) {
        int count=0;
        for(int i=0;i<v.size();i++){
            count=0;
             for(int j=0;j<v.size();j++){
                if(v[i]==v[j])
                    count++;
             }
             if(count==1){
                return v[i];
             }
        }
      return -1;
    }
};
发表于 2023-04-25 20:52:26 回复(0)
public int singleElement (ArrayList<Integer> v) {
        // write code here
        int res=0;
        for(int a : v){
            res=res^a;
        }
        return res;
    }

发表于 2022-12-06 14:14:52 回复(0)
from collections import Counter
class Solution:
    def singleElement(self , v: List[int]) -> int:
        # write code here        
        return sorted(Counter(v).items(), key = lambda x:x[1])[0][0]

发表于 2022-04-28 10:56:30 回复(0)

问题信息

难度:
5条回答 1309浏览

热门推荐

通过挑战的用户

查看代码