46
46
47
47
<!-- 这里可写通用的实现逻辑 -->
48
48
49
+ ** 方法一:二分查找**
50
+
49
51
“二分查找”求 ` target ` 在数组 ` nums ` 中的左右边界。
50
52
53
+ 时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 ` nums ` 的长度。
54
+
51
55
<!-- tabs:start -->
52
56
53
57
### ** Python3**
54
58
55
59
<!-- 这里可写当前语言的特殊实现逻辑 -->
56
60
57
- 自己实现二分查找:
58
-
59
61
``` python
60
62
class Solution :
61
63
def isMajorityElement (self , nums : List[int ], target : int ) -> bool :
62
- def bsearch_left (nums , target , left , right ):
63
- while left < right:
64
- mid = (left + right) >> 1
65
- if nums[mid] >= target:
66
- right = mid
67
- else :
68
- left = mid + 1
69
- return left if nums[left] == target else - 1
70
-
71
- def bsearch_right (nums , target , left , right ):
72
- while left < right:
73
- mid = (left + right + 1 ) >> 1
74
- if nums[mid] <= target:
75
- left = mid
76
- else :
77
- right = mid - 1
78
- return left if nums[left] == target else - 1
79
-
80
- n = len (nums)
81
- left = bsearch_left(nums, target, 0 , n - 1 )
82
- if left == - 1 :
83
- return False
84
- right = bsearch_right(nums, target, left, n - 1 )
85
- if right == - 1 :
86
- return False
87
- return right - left + 1 > n >> 1
88
- ```
89
-
90
- 使用 ` bisect ` 实现二分查找:
91
-
92
- ``` python
93
- class Solution :
94
- def isMajorityElement (self , nums : List[int ], target : int ) -> bool :
95
- left, right = bisect_left(nums, target), bisect_right(nums, target)
96
- return right - left > (len (nums) >> 1 )
64
+ left = bisect_left(nums, target)
65
+ right = bisect_right(nums, target)
66
+ return right - left > len (nums) // 2
97
67
```
98
68
99
69
### ** Java**
@@ -103,41 +73,47 @@ class Solution:
103
73
``` java
104
74
class Solution {
105
75
public boolean isMajorityElement (int [] nums , int target ) {
106
- int n = nums. length;
107
- int left = bsearchLeft(nums, target, 0 , n - 1 );
108
- if (left == - 1 ) {
109
- return false ;
110
- }
111
- int right = bsearchRight(nums, target, left, n - 1 );
112
- if (right == - 1 ) {
113
- return false ;
114
- }
115
- return right - left + 1 > (n >> 1 );
76
+ int left = search(nums, target);
77
+ int right = search(nums, target + 1 );
78
+ return right - left > nums. length / 2 ;
116
79
}
117
80
118
- private int bsearchLeft (int [] nums , int target , int left , int right ) {
81
+ private int search (int [] nums , int x ) {
82
+ int left = 0 , right = nums. length;
119
83
while (left < right) {
120
84
int mid = (left + right) >> 1 ;
121
- if (nums[mid] >= target ) {
85
+ if (nums[mid] >= x ) {
122
86
right = mid;
123
87
} else {
124
88
left = mid + 1 ;
125
89
}
126
90
}
127
- return nums[ left] == target ? left : - 1 ;
91
+ return left;
128
92
}
93
+ }
94
+ ```
129
95
130
- private int bsearchRight (int [] nums , int target , int left , int right ) {
131
- while (left < right) {
132
- int mid = (left + right + 1 ) >> 1 ;
133
- if (nums[mid] <= target) {
134
- left = mid;
135
- } else {
136
- right = mid - 1 ;
137
- }
138
- }
139
- return nums[left] == target ? left : - 1 ;
96
+ ### ** C++**
97
+
98
+ ``` cpp
99
+ class Solution {
100
+ public:
101
+ bool isMajorityElement(vector<int >& nums, int target) {
102
+ auto left = lower_bound(nums.begin(), nums.end(), target);
103
+ auto right = upper_bound(nums.begin(), nums.end(), target);
104
+ return right - left > nums.size() / 2;
140
105
}
106
+ };
107
+ ```
108
+
109
+ ### **Go**
110
+
111
+ ```go
112
+ func isMajorityElement(nums []int, target int) bool {
113
+ n := len(nums)
114
+ left := sort.Search(n, func(i int) bool { return nums[i] >= target })
115
+ right := sort.Search(n, func(i int) bool { return nums[i] > target })
116
+ return right-left > n/2
141
117
}
142
118
```
143
119
0 commit comments