Skip to content

Commit ec60736

Browse files
committed
feat: add solutions to lc problem: No.1885
No.1885.Count Pairs in Two Arrays
1 parent f596a25 commit ec60736

File tree

30 files changed

+2628
-2380
lines changed

30 files changed

+2628
-2380
lines changed

basic/sorting/QuickSort/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public class Main {
113113
System.out.print(nums[i] + " ");
114114
}
115115
}
116-
116+
117117
public static void quickSort(int[] nums, int left, int right) {
118118
if (left >= right) {
119119
return;

lcci/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
快速搜索题号、题解、标签等,请善用 <kbd>Control</kbd>+<kbd>F</kbd>(或者 <kbd>Command</kbd>+<kbd>F</kbd>)。
1212

13-
| 题号 | 题解 | 标签 | 难度 |
14-
| ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------- | ---- |
13+
| 题号 | 题解 | 标签 | 难度 |
14+
| --------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------- | ---- |
1515
| [01.01](https://leetcode.cn/problems/is-unique-lcci) | [判定字符是否唯一](/lcci/01.01.Is%20Unique/README.md) | `数组` | 简单 |
1616
| [01.02](https://leetcode.cn/problems/check-permutation-lcci) | [判定是否互为字符重排](/lcci/01.02.Check%20Permutation/README.md) | `数组`,`字符串` | 简单 |
1717
| [01.03](https://leetcode.cn/problems/string-to-url-lcci) | [URL 化](/lcci/01.03.String%20to%20URL/README.md) | `字符串` | 简单 |

lcci/README_EN.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ _Cracking the Coding Interview, 6th Edition_ is here to help you through this pr
88

99
Press <kbd>Control</kbd>+<kbd>F</kbd>(or <kbd>Command</kbd>+<kbd>F</kbd> on the Mac) to search anything you want.
1010

11-
| # | Solution | Tag | Difficulty |
12-
| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | ---------- |
11+
| # | Solution | Tag | Difficulty |
12+
| --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | ---------- |
1313
| [01.01](https://leetcode.cn/problems/is-unique-lcci) | [Is Unique](/lcci/01.01.Is%20Unique/README_EN.md) | `Array` | Easy |
1414
| [01.02](https://leetcode.cn/problems/check-permutation-lcci) | [Check Permutation](/lcci/01.02.Check%20Permutation/README_EN.md) | `Array`,`String` | Easy |
1515
| [01.03](https://leetcode.cn/problems/string-to-url-lcci) | [String to URL](/lcci/01.03.String%20to%20URL/README_EN.md) | `String` | Easy |

lcof/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
快速搜索题号、题解、标签等,请善用 <kbd>Control</kbd>+<kbd>F</kbd>(或者 <kbd>Command</kbd>+<kbd>F</kbd>)。
1414

15-
| 题号 | 题解 | 标签 | 难度 |
16-
| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ---- |
15+
| 题号 | 题解 | 标签 | 难度 |
16+
| ---------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ---- |
1717
| [03](https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof) | [数组中重复的数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9803.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E9%87%8D%E5%A4%8D%E7%9A%84%E6%95%B0%E5%AD%97/README.md) | `数组`,`哈希表` | 简单 |
1818
| [04](https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof) | [二维数组中的查找](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9804.%20%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%9F%A5%E6%89%BE/README.md) | `数组`,`双指针` | 中等 |
1919
| [05](https://leetcode.cn/problems/ti-huan-kong-ge-lcof) | [替换空格](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9805.%20%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC/README.md) | | 简单 |

lcof2/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
快速搜索题号、题解、标签等,请善用 <kbd>Control</kbd>+<kbd>F</kbd>(或者 <kbd>Command</kbd>+<kbd>F</kbd>)。
1212

13-
| 题号 | 题解 | 标签 | 难度 | 备注 |
14-
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ---- | ---- |
13+
| 题号 | 题解 | 标签 | 难度 | 备注 |
14+
| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ---- | ---- |
1515
| [001](https://leetcode.cn/problems/xoh6Oh) | [ 整数除法](/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20001.%20%E6%95%B4%E6%95%B0%E9%99%A4%E6%B3%95/README.md) | `数学` | 简单 |
1616
| [002](https://leetcode.cn/problems/JFETK5) | [ 二进制加法](/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20002.%20%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8A%A0%E6%B3%95/README.md) | `位运算`,`数学`,`字符串`,`模拟` | 简单 |
1717
| [003](https://leetcode.cn/problems/w3tCBm) | [ 前 n 个数字二进制中 1 的个数](/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20003.%20%E5%89%8D%20n%20%E4%B8%AA%E6%95%B0%E5%AD%97%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%B8%AD%201%20%E7%9A%84%E4%B8%AA%E6%95%B0/README.md) | `位运算`,`动态规划` | 简单 |

lcp/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
快速搜索题号、题解、标签等,请善用 <kbd>Control</kbd>+<kbd>F</kbd>(或者 <kbd>Command</kbd>+<kbd>F</kbd>)。
88

9-
| 题号 | 题解 | 标签 | 难度 | 备注 |
10-
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ---- | ---- |
9+
| 题号 | 题解 | 标签 | 难度 | 备注 |
10+
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ---- | ---- |
1111
| [LCP 01](https://leetcode.cn/problems/guess-numbers) | [ 猜数字](/lcp/LCP%2001.%20%E7%8C%9C%E6%95%B0%E5%AD%97/README.md) | `数组` | 简单 |
1212
| [LCP 02](https://leetcode.cn/problems/deep-dark-fraction) | [ 分式化简](/lcp/LCP%2002.%20%E5%88%86%E5%BC%8F%E5%8C%96%E7%AE%80/README.md) | `数组`,`数学`,`数论`,`模拟` | 简单 |
1313
| [LCP 03](https://leetcode.cn/problems/programmable-robot) | [ 机器人大冒险](/lcp/LCP%2003.%20%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%A4%A7%E5%86%92%E9%99%A9/README.md) | `数组`,`哈希表`,`模拟` | 中等 |

lcs/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
快速搜索题号、题解、标签等,请善用 <kbd>Control</kbd>+<kbd>F</kbd>(或者 <kbd>Command</kbd>+<kbd>F</kbd>)。
88

9-
| 题号 | 题解 | 标签 | 难度 | 备注 |
10-
| -------------------------------------------------- | -------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ---- | ---- |
9+
| 题号 | 题解 | 标签 | 难度 | 备注 |
10+
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ---- | ---- |
1111
| [LCS 01](https://leetcode.cn/problems/Ju9Xwi/) | [ 下载插件](/lcs/LCS%2001.%20%E4%B8%8B%E8%BD%BD%E6%8F%92%E4%BB%B6/README.md) | `数学`,`动态规划` | 简单 |
1212
| [LCS 02](https://leetcode.cn/problems/WqXACV/) | [ 完成一半题目](/lcs/LCS%2002.%20%E5%AE%8C%E6%88%90%E4%B8%80%E5%8D%8A%E9%A2%98%E7%9B%AE/README.md) | `贪心`,`数组`,`哈希表`,`排序` | 简单 |
1313
| [LCS 03](https://leetcode.cn/problems/YesdPw/) | [ 主题空间](/lcs/LCS%2003.%20%E4%B8%BB%E9%A2%98%E7%A9%BA%E9%97%B4/README.md) | `深度优先搜索`,`广度优先搜索`,`并查集`,`数组`,`矩阵` | 中等 |
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
function coinChange(coins: number[], amount: number): number {
2-
let dp = new Array(amount + 1).fill(amount + 1);
3-
dp[0] = 0;
4-
for (const coin of coins) {
5-
for (let j = coin; j <= amount; ++j) {
6-
dp[j] = Math.min(dp[j], dp[j - coin] + 1);
7-
}
8-
}
9-
return dp[amount] > amount ? -1 : dp[amount];
10-
}
1+
function coinChange(coins: number[], amount: number): number {
2+
let dp = new Array(amount + 1).fill(amount + 1);
3+
dp[0] = 0;
4+
for (const coin of coins) {
5+
for (let j = coin; j <= amount; ++j) {
6+
dp[j] = Math.min(dp[j], dp[j - coin] + 1);
7+
}
8+
}
9+
return dp[amount] > amount ? -1 : dp[amount];
10+
}

solution/0300-0399/0336.Palindrome Pairs/README.md

-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
<strong>输出:</strong>[[0,1],[1,0]]
3333
</pre>
3434

35-
36-
3735
<p><strong>提示:</strong></p>
3836

3937
<ul>

solution/0500-0599/0554.Brick Wall/README.md

-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
<strong>输出:</strong>3
2929
</pre>
3030

31-
32-
3331
<p><strong>提示:</strong></p>
3432

3533
<ul>

solution/0700-0799/0745.Prefix and Suffix Search/README.md

-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ WordFilter wordFilter = new WordFilter(["apple"]);
3131
wordFilter.f("a", "e"); // 返回 0 ,因为下标为 0 的单词的 prefix = "a" 且 suffix = 'e" 。
3232
</pre>
3333

34-
35-
3634
<p><strong>提示:</strong></p>
3735

3836
<ul>

solution/0700-0799/0775.Global and Local Inversions/README.md

-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@
4242
<strong>解释:</strong>有 2 个全局倒置,和 1 个局部倒置。
4343
</pre>
4444

45-
46-
4745
<p><strong>提示:</strong></p>
4846

4947
<ul>

solution/0800-0899/0830.Positions of Large Groups/README.md

-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@
4848
<strong>输出:</strong>[]
4949
</pre>
5050

51-
52-
5351
<p><strong>提示:</strong></p>
5452

5553
<ul>

solution/1800-1899/1885.Count Pairs in Two Arrays/README.md

+83-1
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,104 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49+
**方法一:排序 + 二分查找**
50+
51+
`nums1[i] + nums1[j] > nums2[i] + nums2[j]` 可以转换为 `nums1[i] - nums2[i] > -(nums1[j] - nums2[j])`
52+
53+
因此,对 nums1 和 nums2 求对应元素的差值,得到 d 数组,题目就是求 `d[i] > -d[j]` 的所有数对个数。
54+
4955
<!-- tabs:start -->
5056

5157
### **Python3**
5258

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

5561
```python
56-
62+
class Solution:
63+
def countPairs(self, nums1: List[int], nums2: List[int]) -> int:
64+
n = len(nums1)
65+
d = [nums1[i] - nums2[i] for i in range(n)]
66+
d.sort()
67+
return sum(n - bisect_right(d, -v, lo=i + 1) for i, v in enumerate(d))
5768
```
5869

5970
### **Java**
6071

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

6374
```java
75+
class Solution {
76+
public long countPairs(int[] nums1, int[] nums2) {
77+
int n = nums1.length;
78+
int[] d = new int[n];
79+
for (int i = 0; i < n; ++i) {
80+
d[i] = nums1[i] - nums2[i];
81+
}
82+
Arrays.sort(d);
83+
long ans = 0;
84+
for (int i = 0; i < n; ++i) {
85+
int left = i + 1, right = n;
86+
while (left < right) {
87+
int mid = (left + right) >> 1;
88+
if (d[mid] > -d[i]) {
89+
right = mid;
90+
} else {
91+
left = mid + 1;
92+
}
93+
}
94+
ans += n - left;
95+
}
96+
return ans;
97+
}
98+
}
99+
```
100+
101+
### **C++**
102+
103+
```cpp
104+
class Solution {
105+
public:
106+
long long countPairs(vector<int>& nums1, vector<int>& nums2) {
107+
int n = nums1.size();
108+
vector<int> d(n);
109+
for (int i = 0; i < n; ++i) d[i] = nums1[i] - nums2[i];
110+
sort(d.begin(), d.end());
111+
long long ans = 0;
112+
for (int i = 0; i < n; ++i)
113+
{
114+
int j = upper_bound(d.begin() + i + 1, d.end(), -d[i]) - d.begin();
115+
ans += n - j;
116+
}
117+
return ans;
118+
}
119+
};
120+
```
64121
122+
### **Go**
123+
124+
```go
125+
func countPairs(nums1 []int, nums2 []int) int64 {
126+
n := len(nums1)
127+
d := make([]int, n)
128+
for i, v := range nums1 {
129+
d[i] = v - nums2[i]
130+
}
131+
sort.Ints(d)
132+
var ans int64
133+
for i, v := range d {
134+
left, right := i+1, n
135+
for left < right {
136+
mid := (left + right) >> 1
137+
if d[mid] > -v {
138+
right = mid
139+
} else {
140+
left = mid + 1
141+
}
142+
}
143+
ans += int64(n - left)
144+
}
145+
return ans
146+
}
65147
```
66148

67149
### **...**

solution/1800-1899/1885.Count Pairs in Two Arrays/README_EN.md

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

4848
```python
49-
49+
class Solution:
50+
def countPairs(self, nums1: List[int], nums2: List[int]) -> int:
51+
n = len(nums1)
52+
d = [nums1[i] - nums2[i] for i in range(n)]
53+
d.sort()
54+
return sum(n - bisect_right(d, -v, lo=i + 1) for i, v in enumerate(d))
5055
```
5156

5257
### **Java**
5358

5459
```java
60+
class Solution {
61+
public long countPairs(int[] nums1, int[] nums2) {
62+
int n = nums1.length;
63+
int[] d = new int[n];
64+
for (int i = 0; i < n; ++i) {
65+
d[i] = nums1[i] - nums2[i];
66+
}
67+
Arrays.sort(d);
68+
long ans = 0;
69+
for (int i = 0; i < n; ++i) {
70+
int left = i + 1, right = n;
71+
while (left < right) {
72+
int mid = (left + right) >> 1;
73+
if (d[mid] > -d[i]) {
74+
right = mid;
75+
} else {
76+
left = mid + 1;
77+
}
78+
}
79+
ans += n - left;
80+
}
81+
return ans;
82+
}
83+
}
84+
```
85+
86+
### **C++**
87+
88+
```cpp
89+
class Solution {
90+
public:
91+
long long countPairs(vector<int>& nums1, vector<int>& nums2) {
92+
int n = nums1.size();
93+
vector<int> d(n);
94+
for (int i = 0; i < n; ++i) d[i] = nums1[i] - nums2[i];
95+
sort(d.begin(), d.end());
96+
long long ans = 0;
97+
for (int i = 0; i < n; ++i)
98+
{
99+
int j = upper_bound(d.begin() + i + 1, d.end(), -d[i]) - d.begin();
100+
ans += n - j;
101+
}
102+
return ans;
103+
}
104+
};
105+
```
55106
107+
### **Go**
108+
109+
```go
110+
func countPairs(nums1 []int, nums2 []int) int64 {
111+
n := len(nums1)
112+
d := make([]int, n)
113+
for i, v := range nums1 {
114+
d[i] = v - nums2[i]
115+
}
116+
sort.Ints(d)
117+
var ans int64
118+
for i, v := range d {
119+
left, right := i+1, n
120+
for left < right {
121+
mid := (left + right) >> 1
122+
if d[mid] > -v {
123+
right = mid
124+
} else {
125+
left = mid + 1
126+
}
127+
}
128+
ans += int64(n - left)
129+
}
130+
return ans
131+
}
56132
```
57133

58134
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
public:
3+
long long countPairs(vector<int>& nums1, vector<int>& nums2) {
4+
int n = nums1.size();
5+
vector<int> d(n);
6+
for (int i = 0; i < n; ++i) d[i] = nums1[i] - nums2[i];
7+
sort(d.begin(), d.end());
8+
long long ans = 0;
9+
for (int i = 0; i < n; ++i)
10+
{
11+
int j = upper_bound(d.begin() + i + 1, d.end(), -d[i]) - d.begin();
12+
ans += n - j;
13+
}
14+
return ans;
15+
}
16+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
func countPairs(nums1 []int, nums2 []int) int64 {
2+
n := len(nums1)
3+
d := make([]int, n)
4+
for i, v := range nums1 {
5+
d[i] = v - nums2[i]
6+
}
7+
sort.Ints(d)
8+
var ans int64
9+
for i, v := range d {
10+
left, right := i+1, n
11+
for left < right {
12+
mid := (left + right) >> 1
13+
if d[mid] > -v {
14+
right = mid
15+
} else {
16+
left = mid + 1
17+
}
18+
}
19+
ans += int64(n - left)
20+
}
21+
return ans
22+
}

0 commit comments

Comments
 (0)