Skip to content

Commit de75348

Browse files
committed
+ problem 2523
1 parent 68f4184 commit de75348

File tree

5 files changed

+199
-0
lines changed

5 files changed

+199
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# 2523. Closest Prime Numbers in Range
2+
Given two positive integers `left` and `right`, find the two integers `num1` and `num2` such that:
3+
4+
* `left <= nums1 < nums2 <= right`.
5+
* `nums1` and `nums2` are both **prime** numbers.
6+
* `nums2 - nums1` is the **minimum** amongst all other pairs satisfying the above conditions.
7+
8+
Return *the positive integer array* `ans = [nums1, nums2]`. *If there are multiple pairs satisfying these conditions, return the one with the minimum* `nums1` *value or* `[-1, -1]` *if such numbers do not exist*.
9+
10+
A number greater than `1` is called **prime** if it is only divisible by `1` and itself.
11+
12+
#### Example 1:
13+
<pre>
14+
<strong>Input:</strong> left = 10, right = 19
15+
<strong>Output:</strong> [11,13]
16+
<strong>Explanation:</strong> The prime numbers between 10 and 19 are 11, 13, 17, and 19.
17+
The closest gap between any pair is 2, which can be achieved by [11,13] or [17,19].
18+
Since 11 is smaller than 17, we return the first pair.
19+
</pre>
20+
21+
#### Example 2:
22+
<pre>
23+
<strong>Input:</strong> left = 4, right = 6
24+
<strong>Output:</strong> [-1,-1]
25+
<strong>Explanation:</strong> There exists only one prime number in the given range, so the conditions cannot be satisfied.
26+
</pre>
27+
28+
#### Constraints:
29+
* <code>1 <= left <= right <= 10<sup>6</sup></code>
30+
31+
## Solutions (Rust)
32+
33+
### 1. Solution
34+
```Rust
35+
impl Solution {
36+
pub fn closest_primes(left: i32, right: i32) -> Vec<i32> {
37+
let mut is_prime = vec![true; right as usize + 1];
38+
let mut primes = vec![];
39+
let mut ret = vec![-1, i32::MAX - 1];
40+
41+
for nums2 in 2..=right {
42+
if ret[1] - ret[0] < 3 {
43+
break;
44+
}
45+
46+
if is_prime[nums2 as usize] {
47+
if let Some(&nums1) = primes.last() {
48+
if nums1 >= left && nums2 - nums1 < ret[1] - ret[0] {
49+
ret = vec![nums1, nums2];
50+
}
51+
}
52+
53+
primes.push(nums2);
54+
}
55+
56+
for prime in &primes {
57+
if prime * nums2 > right {
58+
break;
59+
}
60+
61+
is_prime[(prime * nums2) as usize] = false;
62+
63+
if nums2 % prime == 0 {
64+
break;
65+
}
66+
}
67+
}
68+
69+
if ret[0] == -1 {
70+
ret[1] = -1;
71+
}
72+
73+
ret
74+
}
75+
}
76+
```
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# 2523. 范围内最接近的两个质数
2+
给你两个正整数 `left``right` ,请你找到两个整数 `num1``num2` ,它们满足:
3+
4+
* `left <= nums1 < nums2 <= right`
5+
* `nums1``nums2` 都是 **质数**
6+
* `nums2 - nums1` 是满足上述条件的质数对中的 **最小值**
7+
8+
请你返回正整数数组 `ans = [nums1, nums2]` 。如果有多个整数对满足上述条件,请你返回 `nums1` 最小的质数对。如果不存在符合题意的质数对,请你返回 `[-1, -1]`
9+
10+
如果一个整数大于 `1` ,且只能被 `1` 和它自己整除,那么它是一个质数。
11+
12+
#### 示例 1:
13+
<pre>
14+
<strong>输入:</strong> left = 10, right = 19
15+
<strong>输出:</strong> [11,13]
16+
<strong>解释:</strong> 10 到 19 之间的质数为 11 ,13 ,17 和 19 。
17+
质数对的最小差值是 2 ,[11,13] 和 [17,19] 都可以得到最小差值。
18+
由于 11 比 17 小,我们返回第一个质数对。
19+
</pre>
20+
21+
#### 示例 2:
22+
<pre>
23+
<strong>输入:</strong> left = 4, right = 6
24+
<strong>输出:</strong> [-1,-1]
25+
<strong>解释:</strong> 给定范围内只有一个质数,所以题目条件无法被满足。
26+
</pre>
27+
28+
#### 提示:
29+
* <code>1 <= left <= right <= 10<sup>6</sup></code>
30+
31+
## 题解 (Rust)
32+
33+
### 1. 题解
34+
```Rust
35+
impl Solution {
36+
pub fn closest_primes(left: i32, right: i32) -> Vec<i32> {
37+
let mut is_prime = vec![true; right as usize + 1];
38+
let mut primes = vec![];
39+
let mut ret = vec![-1, i32::MAX - 1];
40+
41+
for nums2 in 2..=right {
42+
if ret[1] - ret[0] < 3 {
43+
break;
44+
}
45+
46+
if is_prime[nums2 as usize] {
47+
if let Some(&nums1) = primes.last() {
48+
if nums1 >= left && nums2 - nums1 < ret[1] - ret[0] {
49+
ret = vec![nums1, nums2];
50+
}
51+
}
52+
53+
primes.push(nums2);
54+
}
55+
56+
for prime in &primes {
57+
if prime * nums2 > right {
58+
break;
59+
}
60+
61+
is_prime[(prime * nums2) as usize] = false;
62+
63+
if nums2 % prime == 0 {
64+
break;
65+
}
66+
}
67+
}
68+
69+
if ret[0] == -1 {
70+
ret[1] = -1;
71+
}
72+
73+
ret
74+
}
75+
}
76+
```
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
impl Solution {
2+
pub fn closest_primes(left: i32, right: i32) -> Vec<i32> {
3+
let mut is_prime = vec![true; right as usize + 1];
4+
let mut primes = vec![];
5+
let mut ret = vec![-1, i32::MAX - 1];
6+
7+
for nums2 in 2..=right {
8+
if ret[1] - ret[0] < 3 {
9+
break;
10+
}
11+
12+
if is_prime[nums2 as usize] {
13+
if let Some(&nums1) = primes.last() {
14+
if nums1 >= left && nums2 - nums1 < ret[1] - ret[0] {
15+
ret = vec![nums1, nums2];
16+
}
17+
}
18+
19+
primes.push(nums2);
20+
}
21+
22+
for prime in &primes {
23+
if prime * nums2 > right {
24+
break;
25+
}
26+
27+
is_prime[(prime * nums2) as usize] = false;
28+
29+
if nums2 % prime == 0 {
30+
break;
31+
}
32+
}
33+
}
34+
35+
if ret[0] == -1 {
36+
ret[1] = -1;
37+
}
38+
39+
ret
40+
}
41+
}

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,7 @@
12061206
[2515][2515l]|[Shortest Distance to Target String in a Circular Array][2515] |![rs]
12071207
[2520][2520l]|[Count the Digits That Divide a Number][2520] |![rs]
12081208
[2521][2521l]|[Distinct Prime Factors of Product of Array][2521] |![rs]
1209+
[2523][2523l]|[Closest Prime Numbers in Range][2523] |![rs]
12091210
[2525][2525l]|[Categorize Box According to Criteria][2525] |![rs]
12101211
[2526][2526l]|[Find Consecutive Integers from a Data Stream][2526] |![rs]
12111212
[2529][2529l]|[Maximum Count of Positive Integer and Negative Integer][2529] |![py]
@@ -2449,6 +2450,7 @@
24492450
[2515]:Problemset/2515-Shortest%20Distance%20to%20Target%20String%20in%20a%20Circular%20Array/README.md#2515-shortest-distance-to-target-string-in-a-circular-array
24502451
[2520]:Problemset/2520-Count%20the%20Digits%20That%20Divide%20a%20Number/README.md#2520-count-the-digits-that-divide-a-number
24512452
[2521]:Problemset/2521-Distinct%20Prime%20Factors%20of%20Product%20of%20Array/README.md#2521-distinct-prime-factors-of-product-of-array
2453+
[2523]:Problemset/2523-Closest%20Prime%20Numbers%20in%20Range/README.md#2523-closest-prime-numbers-in-range
24522454
[2525]:Problemset/2525-Categorize%20Box%20According%20to%20Criteria/README.md#2525-categorize-box-according-to-criteria
24532455
[2526]:Problemset/2526-Find%20Consecutive%20Integers%20from%20a%20Data%20Stream/README.md#2526-find-consecutive-integers-from-a-data-stream
24542456
[2529]:Problemset/2529-Maximum%20Count%20of%20Positive%20Integer%20and%20Negative%20Integer/README.md#2529-maximum-count-of-positive-integer-and-negative-integer
@@ -3695,6 +3697,7 @@
36953697
[2515l]:https://leetcode.com/problems/shortest-distance-to-target-string-in-a-circular-array/
36963698
[2520l]:https://leetcode.com/problems/count-the-digits-that-divide-a-number/
36973699
[2521l]:https://leetcode.com/problems/distinct-prime-factors-of-product-of-array/
3700+
[2523l]:https://leetcode.com/problems/closest-prime-numbers-in-range/
36983701
[2525l]:https://leetcode.com/problems/categorize-box-according-to-criteria/
36993702
[2526l]:https://leetcode.com/problems/find-consecutive-integers-from-a-data-stream/
37003703
[2529l]:https://leetcode.com/problems/maximum-count-of-positive-integer-and-negative-integer/

README_CN.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,7 @@
12061206
[2515][2515l]|[到目标字符串的最短距离][2515] |![rs]
12071207
[2520][2520l]|[统计能整除数字的位数][2520] |![rs]
12081208
[2521][2521l]|[数组乘积中的不同质因数数目][2521] |![rs]
1209+
[2523][2523l]|[范围内最接近的两个质数][2523] |![rs]
12091210
[2525][2525l]|[根据规则将箱子分类][2525] |![rs]
12101211
[2526][2526l]|[找到数据流中的连续整数][2526] |![rs]
12111212
[2529][2529l]|[正整数和负整数的最大计数][2529] |![py]
@@ -2449,6 +2450,7 @@
24492450
[2515]:Problemset/2515-Shortest%20Distance%20to%20Target%20String%20in%20a%20Circular%20Array/README_CN.md#2515-到目标字符串的最短距离
24502451
[2520]:Problemset/2520-Count%20the%20Digits%20That%20Divide%20a%20Number/README_CN.md#2520-统计能整除数字的位数
24512452
[2521]:Problemset/2521-Distinct%20Prime%20Factors%20of%20Product%20of%20Array/README_CN.md#2521-数组乘积中的不同质因数数目
2453+
[2523]:Problemset/2523-Closest%20Prime%20Numbers%20in%20Range/README_CN.md#2523-范围内最接近的两个质数
24522454
[2525]:Problemset/2525-Categorize%20Box%20According%20to%20Criteria/README_CN.md#2525-根据规则将箱子分类
24532455
[2526]:Problemset/2526-Find%20Consecutive%20Integers%20from%20a%20Data%20Stream/README_CN.md#2526-找到数据流中的连续整数
24542456
[2529]:Problemset/2529-Maximum%20Count%20of%20Positive%20Integer%20and%20Negative%20Integer/README_CN.md#2529-正整数和负整数的最大计数
@@ -3695,6 +3697,7 @@
36953697
[2515l]:https://leetcode.cn/problems/shortest-distance-to-target-string-in-a-circular-array/
36963698
[2520l]:https://leetcode.cn/problems/count-the-digits-that-divide-a-number/
36973699
[2521l]:https://leetcode.cn/problems/distinct-prime-factors-of-product-of-array/
3700+
[2523l]:https://leetcode.cn/problems/closest-prime-numbers-in-range/
36983701
[2525l]:https://leetcode.cn/problems/categorize-box-according-to-criteria/
36993702
[2526l]:https://leetcode.cn/problems/find-consecutive-integers-from-a-data-stream/
37003703
[2529l]:https://leetcode.cn/problems/maximum-count-of-positive-integer-and-negative-integer/

0 commit comments

Comments
 (0)