/*给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。[0,1,1,2,2,5,5] 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例 2: 输入: [3,3,7,7,10,11,11] 输出: 10 注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。*/ /*
思路: 用二分法.mid 为偶数: mid和哪边元素相同,单个的数就在哪边.mid 为奇数: mid和哪边元素不同,单个的数就在哪边.为了简化代码,当mid为奇数时,mid--,转化为偶数.*/
1 class Solution540 { 2 3 public int singleNonDuplicate(int[] nums) { 4 int left = 0; 5 int right = nums.length - 1; 6 while (left < right) { 7 8 int mid = (left + right) >> 1; 9 if ((mid & 1) == 1) { 10 --mid; 11 } 12 if (nums[mid] == nums[mid + 1]) { 13 left = mid + 2; 14 } else { 15 right = mid; 16 } 17 } 18 return nums[left]; 19 } 20 }
原文地址:https://www.cnblogs.com/rainbow-/p/10257128.html
时间: 2024-08-30 01:07:51