Skip to content

Commit b01b916

Browse files
committed
feat: add solutions to lc problem: No.0540. Single Element in a Sorted Array
1 parent 323500a commit b01b916

File tree

8 files changed

+154
-44
lines changed

8 files changed

+154
-44
lines changed

Diff for: solution/0500-0599/0540.Single Element in a Sorted Array/README.md

+48-1
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,62 @@
3636
<!-- 这里可写当前语言的特殊实现逻辑 -->
3737

3838
```python
39-
39+
class Solution:
40+
def singleNonDuplicate(self, nums: List[int]) -> int:
41+
left, right = 0, len(nums) - 1
42+
while left < right:
43+
mid = (left + right) >> 1
44+
if (mid & 1) == 1:
45+
mid -= 1
46+
if nums[mid] == nums[mid + 1]:
47+
left = mid + 2
48+
else:
49+
right = mid
50+
return nums[left]
4051
```
4152

4253
### **Java**
4354

4455
<!-- 这里可写当前语言的特殊实现逻辑 -->
4556

4657
```java
58+
class Solution {
59+
public int singleNonDuplicate(int[] nums) {
60+
int left = 0, right = nums.length - 1;
61+
while (left < right) {
62+
int mid = (left + right) >>> 1;
63+
if ((mid & 1) == 1) {
64+
--mid;
65+
}
66+
if (nums[mid] == nums[mid + 1]) {
67+
left = mid + 2;
68+
} else {
69+
right = mid;
70+
}
71+
}
72+
return nums[left];
73+
}
74+
}
75+
```
4776

77+
### **Go**
78+
79+
```go
80+
func singleNonDuplicate(nums []int) int {
81+
left, right := 0, len(nums)-1
82+
for left < right {
83+
mid := (left + right) >> 1
84+
if (mid & 1) == 1 {
85+
mid--
86+
}
87+
if nums[mid] == nums[mid+1] {
88+
left = mid + 2
89+
} else {
90+
right = mid
91+
}
92+
}
93+
return nums[left]
94+
}
4895
```
4996

5097
### **...**

Diff for: solution/0500-0599/0540.Single Element in a Sorted Array/README_EN.md

+48-1
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,60 @@
4646
### **Python3**
4747

4848
```python
49-
49+
class Solution:
50+
def singleNonDuplicate(self, nums: List[int]) -> int:
51+
left, right = 0, len(nums) - 1
52+
while left < right:
53+
mid = (left + right) >> 1
54+
if (mid & 1) == 1:
55+
mid -= 1
56+
if nums[mid] == nums[mid + 1]:
57+
left = mid + 2
58+
else:
59+
right = mid
60+
return nums[left]
5061
```
5162

5263
### **Java**
5364

5465
```java
66+
class Solution {
67+
public int singleNonDuplicate(int[] nums) {
68+
int left = 0, right = nums.length - 1;
69+
while (left < right) {
70+
int mid = (left + right) >>> 1;
71+
if ((mid & 1) == 1) {
72+
--mid;
73+
}
74+
if (nums[mid] == nums[mid + 1]) {
75+
left = mid + 2;
76+
} else {
77+
right = mid;
78+
}
79+
}
80+
return nums[left];
81+
}
82+
}
83+
```
5584

85+
### **Go**
86+
87+
```go
88+
func singleNonDuplicate(nums []int) int {
89+
left, right := 0, len(nums)-1
90+
for left < right {
91+
mid := (left + right) >> 1
92+
if (mid & 1) == 1 {
93+
mid--
94+
}
95+
if nums[mid] == nums[mid+1] {
96+
left = mid + 2
97+
} else {
98+
right = mid
99+
}
100+
}
101+
return nums[left]
102+
}
56103
```
57104

58105
### **...**
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
1-
/**
2-
* @lc app=leetcode.cn id=540 lang=golang
3-
* Accepted
4-
* 12/12 cases passed (20 ms)
5-
* Your runtime beats 17.65 % of golang submissions
6-
* Your memory usage beats 9.09 % of golang submissions (4.1 MB)
7-
*/
81
func singleNonDuplicate(nums []int) int {
9-
l, m, r := 0, 0, len(nums)-1
10-
for l < r {
11-
m = (r-l)/2 + l
12-
if m%2 == 1 {
13-
m--
2+
left, right := 0, len(nums)-1
3+
for left < right {
4+
mid := (left + right) >> 1
5+
if (mid & 1) == 1 {
6+
mid--
147
}
15-
if nums[m] == nums[m+1] {
16-
l = m + 2
8+
if nums[mid] == nums[mid+1] {
9+
left = mid + 2
1710
} else {
18-
r = m
11+
right = mid
1912
}
2013
}
21-
return nums[r]
14+
return nums[left]
2215
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public int singleNonDuplicate(int[] nums) {
3+
int left = 0, right = nums.length - 1;
4+
while (left < right) {
5+
int mid = (left + right) >>> 1;
6+
if ((mid & 1) == 1) {
7+
--mid;
8+
}
9+
if (nums[mid] == nums[mid + 1]) {
10+
left = mid + 2;
11+
} else {
12+
right = mid;
13+
}
14+
}
15+
return nums[left];
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def singleNonDuplicate(self, nums: List[int]) -> int:
3+
left, right = 0, len(nums) - 1
4+
while left < right:
5+
mid = (left + right) >> 1
6+
if (mid & 1) == 1:
7+
mid -= 1
8+
if nums[mid] == nums[mid + 1]:
9+
left = mid + 2
10+
else:
11+
right = mid
12+
return nums[left]

Diff for: solution/1100-1199/1150.Check If a Number Is Majority Element in a Sorted Array/README.md

+11
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454

5555
<!-- 这里可写当前语言的特殊实现逻辑 -->
5656

57+
自己实现二分查找:
58+
5759
```python
5860
class Solution:
5961
def isMajorityElement(self, nums: List[int], target: int) -> bool:
@@ -85,6 +87,15 @@ class Solution:
8587
return right - left + 1 > n >> 1
8688
```
8789

90+
使用 `bisect` 实现二分查找:
91+
92+
```python
93+
class Solution:
94+
def isMajorityElement(self, nums: List[int], target: int) -> bool:
95+
left, right = bisect.bisect_left(nums, target), bisect.bisect_right(nums, target)
96+
return right - left > (len(nums) >> 1)
97+
```
98+
8899
### **Java**
89100

90101
<!-- 这里可写当前语言的特殊实现逻辑 -->

Diff for: solution/1100-1199/1150.Check If a Number Is Majority Element in a Sorted Array/README_EN.md

+7
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ class Solution:
7676
return right - left + 1 > n >> 1
7777
```
7878

79+
```python
80+
class Solution:
81+
def isMajorityElement(self, nums: List[int], target: int) -> bool:
82+
left, right = bisect.bisect_left(nums, target), bisect.bisect_right(nums, target)
83+
return right - left > (len(nums) >> 1)
84+
```
85+
7986
### **Java**
8087

8188
```java
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,4 @@
11
class Solution:
22
def isMajorityElement(self, nums: List[int], target: int) -> bool:
3-
def bsearch_left(nums, target, left, right):
4-
while left < right:
5-
mid = (left + right) >> 1
6-
if nums[mid] >= target:
7-
right = mid
8-
else:
9-
left = mid + 1
10-
return left if nums[left] == target else -1
11-
12-
def bsearch_right(nums, target, left, right):
13-
while left < right:
14-
mid = (left + right + 1) >> 1
15-
if nums[mid] <= target:
16-
left = mid
17-
else:
18-
right = mid - 1
19-
return left if nums[left] == target else -1
20-
21-
n = len(nums)
22-
left = bsearch_left(nums, target, 0, n - 1)
23-
if left == -1:
24-
return False
25-
right = bsearch_right(nums, target, left, n - 1)
26-
if right == -1:
27-
return False
28-
return right - left + 1 > n >> 1
3+
left, right = bisect.bisect_left(nums, target), bisect.bisect_right(nums, target)
4+
return right - left > (len(nums) >> 1)

0 commit comments

Comments
 (0)