1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public boolean isMajorityElement(int[] nums, int target) { int first = binarySearchFloor(nums, target); if (first == -1) return false; int second = first + nums.length / 2; if (second >= nums.length || nums[second] != target) return false; return true; }
private int binarySearchFloor(int[] nums, int target) { int left = 0, right = nums.length - 1, ans = -1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; } else if (nums[mid] > target) { right = mid - 1; } else { ans = mid; right = mid - 1; } } return ans; } }
|
看到sorted, 就是binary search. 找到值等于target的最小index. 如果是majority, 那么另一端的index是second. 就有second - first + 1 > nums.length / 2. 于是second需要大于等于first + nums.length / 2. 我们就看这个位置是不是出界或者不等于target, 满足任意一个就返回false, 否则就是true.
时间复杂度: O(logn)
空间复杂度: O(1)