您的位置:首页 > 其它

LeetCode 540. Single Element in a Sorted Array

2017-04-09 19:42 483 查看
这次随便找了一道题写,之前找了一道题,写了一个上午都没写出来就放弃了,一气之下就直接随便选了一道题写。话不多少之前看题吧。

---------------------这是题目-----------------------------

Given a sorted array consisting of only integers where every element appears twice except for one element which appears once. Find this single element that appears only once.

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.
---------------------------这是题解-----------------------------

题目的意思就是给你一个序列,找到一个也是唯一的一个单身狗,其他的都是有对象的。心疼自己,不要问我为什么。当然了,问题不难,但是要求是时间复杂度为logn,没有时间复杂度的要求我们倒是可以直接遍历一次就可以找到了。注意看题目,题目中告诉我们这是一个有序的序列,有序有什么用呢?有大用!这告诉我们这些情侣都是同城的!没有异地恋,方便秀恩爱,不知道这唯一一个单身狗是怎么想的。好吧现实就是这么残酷,现在我们就开始来找这条单身狗吧。

这个序列的长度肯定是奇数,毕竟有单身狗混在里面。logn的复杂度有没有很熟悉呢?没错,就是二分查找,现在我们顺着二分查找的思路,由于这是一个奇数的序列,我们能够找到一个严格的中间点,即前后的子序列长度相同,但是还有一个问题,这两个子序列的长度是偶数还是奇数呢?有小朋友肯定是偶数,前后都是情侣啊。

XXXXOXXXXXX

XXOXXXXXX

现在请告诉我第一种情况下我要怎么去找到单身狗,我们找到这个中间的情侣之一,发现后面的朋友才是他的情侣,那么根据示意图我们发现单身狗藏在前面的那个子序列中,第二种情况中,中间的那位哥的前面才是他的另一半,同样,根据示意图我们发现单身狗藏在前面的子序列。换一种情况呢?

这件事是可以通过合理的证明的,我们在一个序列的中间点,前后子序列长度为奇数时,如果中间点和它前面的是一个组的,除去这两个点后前面的子序列长度就是偶数了,肯定就是藏不住单身狗的了,所以单身狗就在后面的子序列中,其余三种情况请自行推导。这位爷说了,要是中见点就是单身狗怎么办?这是个好问题,同时我也只能恭喜你中奖了。

思路就是这样,很简单吧,代码就是根据这个思路来的。下面直接上代码吧

-------------------------下面是代码--------------------------------

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
int findans(vector<int>& nums,int l,int r)
{
if(l==r)
return l;
int m=(l+r)/2;
if(m%2==0)
{
if(nums[m]==nums[m+1])
return findans(nums,l,m-1);
else if(nums[m]==nums[m-1])
return findans(nums,m+1,r);
else
return m;
}
else{
if(nums[m]==nums[m+1])
return findans(nums,m+2,r);
else if(nums[m]==nums[m-1])
return findans(nums,l,m-2);
else
return m;
}
}
int singleNonDuplicate(vector<int>& nums) {
int l=nums.size();
return findans(nums,0,l-1);
}
};由于代码很简单,所以就没有注释了,而且这是一旦单纯的数学题,没有什么编程技巧,大家自行理解吧。
-------------------------------手动分割线-------------------------

see you next illusion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息