Skip to content

Commit 1caed4a

Browse files
committed
Add another step3
1 parent 0b1016e commit 1caed4a

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

373/step3_3.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
{i + 1, j}と{i, j + 1}をpriority_queueにいれる時に、{i + 1, j - 1}と{i - 1, j + 1}がvisitedに含まれているかを確認して効率化するパターン
3+
条件判定部分が無駄に複雑なので関数化したいが、いい感じにできないのでそのままにしている
4+
*/
5+
class Solution {
6+
public:
7+
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
8+
priority_queue<SumIndex, vector<SumIndex>, greater<SumIndex>> sum_index;
9+
vector<vector<int>> minimum_k_pair;
10+
set<vector<int>> visited;
11+
sum_index.push({nums1[0] + nums2[0], 0, 0});
12+
while (minimum_k_pair.size() < k && sum_index.size() > 0) {
13+
int i = sum_index.top().num1_index;
14+
int j = sum_index.top().num2_index;
15+
sum_index.pop();
16+
minimum_k_pair.push_back({nums1[i], nums2[j]});
17+
if (i + 1 < nums1.size() && !visited.contains({i + 1, j}) && (j == 0 || visited.contains({i + 1, j - 1}))) {
18+
sum_index.push({nums1[i + 1] + nums2[j], i + 1, j});
19+
visited.insert({i + 1, j});
20+
}
21+
if (j + 1 < nums2.size() && !visited.contains({i, j + 1}) && (i == 0 || visited.contains({i - 1, j + 1}))) {
22+
sum_index.push({nums1[i] + nums2[j + 1], i, j + 1});
23+
visited.insert({i, j + 1});
24+
}
25+
}
26+
return minimum_k_pair;
27+
}
28+
29+
private:
30+
struct SumIndex {
31+
int sum;
32+
int num1_index;
33+
int num2_index;
34+
35+
bool operator> (const SumIndex& other) const {
36+
return sum > other.sum;
37+
}
38+
};
39+
};

0 commit comments

Comments
 (0)