首页 > 编程语言 > 详细

p103 有序数组中的单一元素(leetcode 540)

时间:2020-04-08 18:08:00      阅读:68      评论:0      收藏:0      [点我收藏+]

一:解题思路

这个题目如果采用之前单身数字那个题目的方法来做,时间复杂度为O(n)。但题目的要求是O(log(n)),所以不能采用哪种方法。

这个题目可以采用二分搜索的思想来做,对于数组中的任意一个数字,1.要么等于它左边的数字,2.要么等于它右边的数字,3.要么即不等于左边的数字,又不等于它右边的数字,这个时候就是单身数字。

Time:O(log(n)),Space:O(1)

二:完整代码示例 (C++版和Java版)

C++:

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

            if ((mid - low) % 2 == 1) high = mid - 1;
            else low = mid + 2;
        }

        return -1;
    }
};

Java:

class Solution {
        public int singleNonDuplicate(int[] nums) 
        {
              int low=0,high=nums.length-1;
              while(low<=high)
              {
                  int mid=low+(high-low)/2;
                  if(mid-1>=0 && nums[mid]==nums[mid-1]) mid--;
                  else if(mid+1<nums.length && nums[mid]==nums[mid+1]){}
                  else return nums[mid];
                  
                  if((mid-low)%2==1) high=mid-1;
                  else low=mid+2;
              }
              
              return -1;
        }
    }

 

p103 有序数组中的单一元素(leetcode 540)

原文:https://www.cnblogs.com/repinkply/p/12660554.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!