今日のアルゴリズム 01 - 配列内の繰り返しの数値

1. トピックの説明

難易度: 簡単

長さ n の配列 nums 内のすべての数値は、0 から n-1 の範囲にあります。配列内の一部の数値が繰り返されていますが、繰り返される数値の数がわかりません。また、各数値が何回繰り返されるかもわかりません。配列内で繰り返される数値を見つけてください。

 输入:
 [2, 3, 1, 0, 2, 5, 3]
 输出:23 

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…

おすすめ

転載: juejin.im/post/7254473296612114487