解決策の1つは、要素の絶対値をインデックスとして使用し、このインデックスの下の要素の符号を変更して配列をウォークスルーすることです。 その場合、すでにネガティブとマークされている要素のインデックスは重複値です。
2番目のパスでは、正の値を見つける必要があります。
#include<stdio.h> #include<stdlib.h> void printTwoElements(int arr[], int size) { int i; printf("\n The repeating element is"); for(i = 0; i < size; i++) { if(arr[abs(arr[i])-1] > 0) arr[abs(arr[i])-1] = -arr[abs(arr[i])-1]; else printf(" %d ", abs(arr[i])); } printf("\nand the missing element is "); for(i=0; i<size; i++) { if(arr[i]>0) printf("%d",i+1); } } /* Driver program to test above function */ int main() { int arr[] = {7, 3, 4, 5, 5, 6, 2}; int n = sizeof(arr)/sizeof(arr[0]); printTwoElements(arr, n); return 0; }
アルゴリズムの複雑さはO(n)です。