LeetCode 540. Single Element in a Sorted Array

这次随便找了一道题写,之前找了一道题,写了一个上午都没写出来就放弃了,一气之下就直接随便选了一道题写。话不多少之前看题吧。

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值