540. Single Element in a Sorted Array

来源:互联网 发布:淘宝排名查询流量 编辑:程序博客网 时间:2024/05/20 12:21

题目的要求是:给定一个排好序的数组,数组中只有一个数出现一次,其他的数字都出现两次,要我们找到出现一次的数字。算法的时间复杂度要求是O(log N),空间复杂度为O(1)。例子如下:

Example 1:

Input: [1,1,2,3,3,4,4,8,8]Output: 2

Example 2:

Input: [3,3,7,7,10,11,11]Output: 10

Note: Your solution should run in O(log n) time and O(1) space.

按照题目对时间复杂度的要求,我们不难想到用二分查找的方法去解决问题。令front为数组头下标,rear为数组尾下标,mid为(front+rear)/ 2,所以有以下三种情况:

1. nums[mid] = nums[mid-1],则数组可以分为【front,mid-2】跟【mid+1,rear】两部分,其中只出现一次的数字在长度为奇数的部分中,在该部分中重复查找;

2. nums[mid] = nums[mid+1],则数组可以分为【front+1,mid-1】跟【mid+2,rear】两部分,其中只出现一次的数字在长度为奇数的部分中,在该部分中重复查找;

3. nums[mid] != nums[mid-1]同时nums[mid] != nums[mid+1],说明nums[mid]就是只出现一次的数字。

所以,按照上面的思路,代码如下:

class Solution {public:    int singleNonDuplicate(vector<int>& nums) {        int front = 0;        int rear = nums.size() - 1;        int mid;        while (front <= rear) {            mid = (front + rear) / 2;            if (nums[mid] == nums[mid-1]) {                if ((mid - 1 - front) % 2)                    rear = mid - 2;                else                    front = mid + 1;            }            else if (nums[mid] == nums[mid+1]) {                if ((mid - front) % 2)                    rear = mid - 1;                else                    front = mid + 2;            }            else {                break;            }        }        return nums[mid];    }};


原创粉丝点击