1. トピックの説明
難易度: 簡単
長さ n の配列 nums 内のすべての数値は、0 から n-1 の範囲にあります。配列内の一部の数値が繰り返されていますが、繰り返される数値の数がわかりません。また、各数値が何回繰り返されるかもわかりません。配列内で繰り返される数値を見つけてください。
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
2. 問題解決のアイデア
時間計算量 O(N) と空間計算量 O(1) が必要です。したがって、sort メソッドを使用したり、追加のタグ配列を使用したりすることはできません。
配列要素が [0, n-1] の範囲にあるという問題は、値が i の要素を i 番目の位置に調整すれば解決できます。調整プロセス中に、i 番目の位置に値 i を持つ要素がすでに存在する場合、i の値が繰り返されることがわかります。
(2, 3, 1, 0, 2, 5) を例にとると、位置 4 に移動するとき、この位置の数値は 2 ですが、2 番目の位置にはすでに値 2 があるため、次のことがわかります。 2を繰り返す:
3. コードの実装
public int duplicate(int[] nums) {
for (int i = 0; i < nums.length; i++) {
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
swap(nums, i, nums[i]);
}
swap(nums, i, nums[i]);
}
return -1;
}
private void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
デイリーアルゴリズムシリーズ、問題解決方法の更新アドレス:studeyang.tech/2023/0712.h…