LeetCode-1743。隣接するペアから配列を復元する[隣接するペアから配列を復元する]-分析とコード[Java]
1.トピック
n個の異なる要素で構成される整数配列numsがありますが、特定の内容を思い出せません。幸いなことに、隣接する要素のすべてのペアをnumで覚えています。
2次元の整数配列隣接ペアを与えます。サイズはn-1です。ここで、各隣接ペア[i] = [ui、vi]は、要素uiとviがnumで隣接していることを意味します。
タイトルデータは、要素nums [i]とnums [i +1]で構成される隣接する要素のすべてのペアが隣接するペアに存在することを保証します。存在形式は[nums [i]、nums [i +1]]または[nums [i + 1]、nums [i]]。隣接する要素のこれらのペアは、任意の順序で表示できます。
元の配列番号を返します。複数の回答がある場合は、そのうちの1つを返してください。
例1:
输入:adjacentPairs = [[2,1],[3,4],[3,2]]
输出:[1,2,3,4]
解释:数组的所有相邻元素对都在 adjacentPairs 中。
特别要注意的是,adjacentPairs[i] 只表示两个元素相邻,并不保证其 左-右 顺序。
例2:
输入:adjacentPairs = [[4,-2],[1,4],[-3,1]]
输出:[-2,4,1,-3]
解释:数组中可能存在负数。
另一种解答是 [-3,1,4,-2] ,也会被视作正确答案。
例3:
输入:adjacentPairs = [[100000,-100000]]
输出:[100000,-100000]
促す:
- nums.length == n
- neighborPairs.length == n-1
- neighborPairs [i] .length == 2
- 2 <= n <= 105
- -105 <= nums [i]、ui、vi <= 105
- タイトルデータにより、隣接するペアを要素ペアとして持つ配列numがいくつか存在することが保証されます。
出典:LeetCode(LeetCode)
リンク:https://leetcode-cn.com/problems/restore-the-array-from-adjacent-pairs
著作権はLeadCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2、分析とコード
1.ハッシュテーブル
(1)考える
2つのハッシュテーブルを使用して、要素間の隣接関係を記録し、統計の数と組み合わせて最初の要素を取得すると、元の配列を推測できます。
(2)コード
class Solution {
public int[] restoreArray(int[][] adjacentPairs) {
int n = adjacentPairs.length + 1, len = 200001, delta = 100000;
int [] map1 = new int[len], map2 = new int[len], num = new int[len], ans = new int[n];
for (int i = 0; i < len; i++) {
map1[i] = -1;
map2[i] = -1;
}
//统计元素个数、构造哈希表
for (int[] adj : adjacentPairs) {
int a = adj[0], b = adj[1];
num[a + delta]++;
num[b + delta]++;
if (map1[a + delta] == -1)
map1[a + delta] = b;
else
map2[a + delta] = b;
if (map1[b + delta] == -1)
map1[b + delta] = a;
else
map2[b + delta] = a;
}
//求原始数组前2元素
ans[0] = findNum0(num) - delta;
if (map1[ans[0] + delta] != -1)
ans[1] = map1[ans[0] + delta];
else
ans[1] = map2[ans[0] + delta];
//求原始数组其他元素
int last2 = ans[0], last = ans[1];
for (int i = 2; i < n; i++) {
if (map1[last + delta] != last2)
ans[i] = map1[last + delta];
else
ans[i] = map2[last + delta];
last2 = last;
last = ans[i];
}
return ans;
}
public int findNum0(int[] num) {
for (int i = 0; i < num.length; i++)
if (num[i] == 1)
return i;
return -1;
}
}
(3)結果
実行時間:27ミリ秒、
すべてのJava送信でユーザーの99.84%を上回っています。メモリ消費量:80.7 MB、すべてのJava送信でユーザーの78.96%を上回っています。
3、その他
len変数とdelta変数を数値に直接置き換えることにより、実行時間の100%以上を取得できます。