列表

详情


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

描述

给定一个长度为 n 的有序数组,其中每个元素都出现两次,只有一个数仅出现一次。请你找出这个数。
你能在O(logn)的时间复杂度和O(1)的 空间复杂度下完成本题吗

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

示例1

输入:

[1,2,2,3,3]

输出:

1

示例2

输入:

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

输出:

9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 28ms, 内存消耗: 3888KB, 提交时间: 2022-06-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param v int整型vector 
     * @return int整型
     */
    int singleElement(vector<int>& v) {
        // write code here
        int l = 0, r = v.size()-1, m=0;
        while(l<=r)
        {
            m = (l+r)/2;
            if(v[m]!=v[m+1] && v[m]!=v[m-1])
                break;
            if(m%2==0)
            {
                if(v[m]==v[m+1])
                {
                    l = m+1;
                }
                else
                    r = m-1;
            }
            else
            {
                if(v[m]==v[m-1])
                {
                    l = m+1;
                }
                else
                    r = m-1;
            }
        }
        return v[m];
        
    }
};

C++ 解法, 执行用时: 29ms, 内存消耗: 3912KB, 提交时间: 2022-07-25

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param v int整型vector 
     * @return int整型
     */
    int singleElement(vector<int>& v) {
         int l = 0, r = v.size()-1, m=0;
        while(l<=r)
        {
            m = (l+r)/2;
            if(v[m]!=v[m+1] && v[m]!=v[m-1])
                break;
            if(m%2==0)
            {
                if(v[m]==v[m+1])
                {
                    l = m+1;
                }
                else
                    r = m-1;
            }
            else
            {
                if(v[m]==v[m-1])
                {
                    l = m+1;
                }
                else
                    r = m-1;
            }
        }
        return v[m];
    }
};

C++ 解法, 执行用时: 30ms, 内存消耗: 3892KB, 提交时间: 2022-07-28

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param v int整型vector 
     * @return int整型
     */
    int singleElement(vector<int>& v) {
        // write code here
        int n = v.size();
        if(n==1)
            return v[0];
        int l=0,r = n-1,m=0;
       
        while(l<=r)
        {
            m = (l+r)/2;
            if(v[m] != v[m+1] && v[m]!=v[m-1])
                break;
            if(m%2 ==0)
            {
                if(v[m] == v[m+1])
                    l = m+2;
                else
                    r = m-1;
            }
            else
            {
                 if(v[m] == v[m-1])
                    l = m+1;
                else
                    r = m-1;
            }
        }
           return v[m]; 
    }
};

C++ 解法, 执行用时: 30ms, 内存消耗: 3908KB, 提交时间: 2022-07-15

class Solution {
  public:
    int singleElement(vector<int>& v) {
        int i = 0, n = v.size() - 1, m = 0;
        while (i <= n) {
            m = (i + n) / 2;
            if (v[m] != v[m + 1] && v[m] != v[m - 1])
                break;
            if (m % 2 == 0) {
                if (v[m] == v[m + 1]) {
                    i = m + 1;
                } else
                    n = m - 1;
            } else {
                if (v[m] == v[m - 1]) {
                    i = m + 1;
                } else
                    n = m - 1;
            }
        }
        return v[m];

    }
};

C++ 解法, 执行用时: 30ms, 内存消耗: 3908KB, 提交时间: 2022-04-13

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param v int整型vector 
     * @return int整型
     */
    int singleElement(vector<int>& v) {
        int l=0,r=v.size()-1;
        while(l<=r)
        {
            int m=(l+r)/2;
            if(m%2!=0)
            {
                if(v[m]==v[m-1])
                    l=m+1;
                else r=m-1;
            }
            else 
            {
                if(v[m]==v[m+1])
                    l=m+1;
                else r=m-1;
            }
            
        }
        return v[l];
    }
};

上一题