Leetcode: 645. 設定された問題に対する間違った解決策 [超詳細]

トピック

このセット には から まで の 整数がs 含まれます 。残念ながら、データ エラーにより、セット内の数値がセット内の別の数値の値にコピーされ、セットの 数値が失われ 、 重複した数値が発生してしまいました 。1n

 エラーのコレクションの結果nums を表す 配列が与えられます 。S

繰り返し現れる整数を見つけて、欠落している整数を見つけて、それらを配列の形式で返してください。

それは次のようなものでしょうか:シンプル

トピック

リンク: 645. エラー集

例 1:

入力: nums = [1,2,2,4]
出力: [2,3]

例 2:

入力: nums = [1,1]
出力: [1,2]

ヒント:

  • 2 <= nums.length <= 104
  • 1 <= nums[i] <= 104

質問分析

質問によれば、集合 s [1, n] 内の 1 つの要素が繰り返され、1 つの要素が欠落していることがわかります。質問では、配列 (つまり、繰り返される要素と欠落している要素) を返す必要があります。まず繰り返される要素を見つけてから、欠落している要素を見つけます。この方法の解決策は比較的簡単です。

コード表示

int* findErrorNums(int* nums, int numsSize, int* returnSize) {
    int* arr = (int*)malloc(sizeof(int) * 2);
    int i = 0; int j = 0;
    //找出复的数组元素
    for (i = 0; i < numsSize; i++)
    {
        for (j = i + 1; j < numsSize; j++)
        {
            if (nums[i] == nums[j])
            {
                arr[0] = nums[i];
            }
        }
    }
    //找出丢失的元素
    int arr2[10001] = { 0 };//创建临时数组
    //元素置零
    for (i = 0; i < numsSize; i++)
    {
        arr2[i] = 0;
    }
    int x = 0;
    for (i = 0; i < numsSize; i++)
    {
        x = nums[i] % (numsSize + 1);
        arr2[x - 1] = x;
    }
    j = 0;
    for (i = 1; i <= numsSize; i++)
    {
        if (arr2[i - 1] == 0)//遍历临时数组
        {
            arr[1] = i;
        }
    }
    *returnSize = 2;
    return arr;
}

 質問の超詳細な分析

1. 繰り返される要素を見つける

ここで使用されているのは 2 層の for ループで、外側のループは最初の要素を通過し、内側のループの初期条件は 2 番目の要素になります。

これは私たちのアイデアであり、最初の要素を 2 番目の要素と 3 番目の要素と比較し、次に次の要素をその下にある他の要素と比較します (重複要素が見つかるまで)。

2. 不足している要素を見つける 

 ここで求められる欠落要素は、単純なアイデアとして、一時配列 (配列内のすべての要素が 0 に設定される) を使用して、配列要素 [1, n] を対応する配列 (つまり、対応する配列の添字付き) に格納するというものです。同様に) [例] 要素 1 は一時配列の添字 1 に格納され、要素 5 は一時配列の添字 5 に配置されます。

次に、サイズ numsSize の配列を走査します。ゼロの要素 (要素が 1 つだけ欠落しているため) が、欠落している配列です。

ここにある上記のテキストが非常に理解できる場合は、読んでください。 

Leetcode:【448. 配列内の欠落している数値をすべて見つける】解決策

おすすめ

転載: blog.csdn.net/qq_72505850/article/details/132595170