(Java) 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.
数组查找问题,一上来想法很多啊,什么哈希表,位运算……可是一看到时间复杂度限制,就要重新思考。一个很重要的条件是数组有序,其中隐含的意思是所有重复出现的数字都紧挨着。那么根据其中只有一个元素出现一次这一条件,数组长度一定是奇数。这样每次找到数组最中间的数,先判断它和它左边的数相等,还是右边的数相等,还是都不相等。如果都不相等,那么它一定就是要找到独一无二的数。如果和左边或者右边的数相等,那么还要在判断一下此时它左右总共有多少个元素。举例子,如果中间那个数和它左边的数相等,且它左边有偶数个元素,那么说明包含它在内左边就会有奇数个元素,证明单独出现的元素一定在左半区。相似的,如果它左边有奇数个元素,那么包含它在内的左边就会有偶数个元素,也就是说,左半区的元素都是成对出现,即单独出现的元素一定不在这个半区,而是在右半区。上述两个例子分别对应题目的例子1和例子2。同样的情况,如果中间的元素和它右边的数相等,只要把情况反过来即可。这样每次都可以把范围缩小一半,就像二分查找一样,时间复杂度即为O(logn)。
想了一下,这道题貌似不需要数组整体有序,只需要成对出现的元素紧挨着彼此即可。
Java
class Solution { public int singleNonDuplicate(int[] nums) { int l = 0, r = nums.length - 1, len = nums.length/2; while (l < r) { int mid = l + (r - l) / 2; if (nums[mid] == nums[mid - 1]) { if (len % 2 == 0) r = mid; else l = mid + 1; } else if (nums[mid] == nums[mid + 1]) { if (len % 2 == 0) l = mid; else r = mid - 1; } else return nums[mid]; len /= 2; } return nums[l]; } }
- [LeetCode] Single Element in a Sorted Array 有序数组中的单独元素
- [LeetCode]540. Single Element in a Sorted Array
- 【LeetCode】540. Single Element in a Sorted Array 解题报告
- leetcode 540. Single Element in a Sorted Array
- lettcode:540. Single Element in a Sorted Array(已排序数组中出现一次的数字,其他数字出现两次)
- LeetCode 540. Single Element in a Sorted Array
- LeetCode | 540. Single Element in a Sorted Array
- python--leetcode540. Single Element in a Sorted Array
- leetcode 540. Single Element in a Sorted Array
- [LeetCode]540. Single Element in a Sorted Array
- LeetCode 540. Single Element in a Sorted Array (Medium)
- LeetCode 540. Single Element in a Sorted Array
- LeetCode - 540. Single Element in a Sorted Array
- [Java语言] [Leetcode] Find Minimum in Rotated Sorted Array 找旋转有序数组的最小值
- {LeetCode} 540. Single Element in a Sorted Array
- LeetCode 540. Single Element in a Sorted Array
- 【LeetCode】540. Single Element in a Sorted Array
- leetcode 540. Single Element in a Sorted Array
- leetcode 540. Single Element in a Sorted Array 题解
- [Leetcode] 540. Single Element in a Sorted Array 解题报告