arr [i]가 i와 같도록 배열 재 배열


난이도 쉽게
자주 묻는 질문 Accenture 어도비 벽돌 아마존 광신자 포카이트 조호 (Zoho)
배열 해시

“arr [i] = i가되도록 배열을 재정렬하십시오”문제는 0에서 n-1 범위의 정수 배열이 제공된다는 것을 나타냅니다. 모든 요소가 배열에 존재하지 않을 수 있으므로 그 대신 -1이 있습니다. 문제 설명은 범위 사이의 숫자가 배열에없는 경우 배열을 재 배열하고 -1로 표시하고 요소를 arr [i] = i로 재 배열하도록 요청합니다.

arr[]={9,4,-1,-1,2,7,8,1,5,-1}
[-1, 1, 2, -1, 4, 5, -1, 7, 8, 9]

설명 : 이후 요소가 범위 내에 없습니다. 그런 다음 -1로 대체되고 배열 인덱스가 숫자 자체로 대체됩니다.

arr [i]가 i와 같도록 배열을 재배 열하는 알고리즘

1. Traverse the array from 0 to n-1(length of the array).
2. Check if arr[i] is greater than equal to 0 and not equal to i.
    1. Swap the elements by doing the following steps.
        1. temp = arr[arr[i]]
        2. arr[arr[i]] = arr[i]
        3. arr[i] = temp
3. Else increase the value of i.
4. Print the array.

설명

우리는 주어진 정렬 of 정수 크기 n. o에서 n-1 사이의 숫자를 포함합니다. 일부 숫자가 누락 될 수 있습니다. 범위에서. arr [i]가 i로 값이되는 모든 요소를 ​​대체하도록 요청했습니다. 배열 내에 숫자가 없으면 -1로 바꿔야합니다. 0에서 4까지의 범위가 있다고 가정합니다. 여기서 배열에 2와 3 만 있고 나머지는 요소로 -1입니다. 그러면 인덱스에 2와 3을 배치해야합니다. arr [2] = 2 및 arr [3] = 3이고 나머지 자리는 1에서 0까지의 범위 내에 숫자가없는 경우 -4로 표시됩니다.

우리는 배열을 제공했습니다. 우리의 주된 아이디어는“arr [i] = i가되도록 배열 재 배열”문제를 해결하기 위해 배열의 요소를 바꾸는 것입니다. 0에서 n-1까지 배열을 탐색하고 "i"의 각 값을 확인합니다. arr [i]가 0보다 크면 음수. 또 다른 부분에서 'i'의 값을 증가시키고 있기 때문에 루프가 무한하지 않도록 거기에 적용되는 조건이 있습니다. 그래서 우리는 또한 arr [i]도“i”와 같지 않아야합니다. 따라서 건너 뛰고 더 멀리 이동하고 더 많은 값을 확인할 수 있습니다.

0보다 크고 i와 같지 않은 값을 바꾸면됩니다. 또한 배열 내에서 범위 내에서 단일 루프를 사용하여 교체하고 있습니다. 이것이 바로 arr [i] 값의 배열을 교체하는 이유입니다. 그리고 마지막으로 배열의 값을 인쇄하십시오.

arr [i] = i가되도록 배열 재정렬

실시

arr [i]가 i와 같도록 배열을 재배 열하는 C ++ 프로그램

#include<iostream>

using namespace std;

void arrayRearrange(int arr[], int n)
{
    for (int i = 0; i < n;)
    {
        if (arr[i] >= 0 && arr[i] != i)
        {
            int temp = arr[arr[i]];
            arr[arr[i]] = arr[i];
            arr[i] = temp;
        }
        else
        {
            i++;
        }
    }
    for(int i = 0; i < n; i++)
        cout<<arr[i]<<" ";
}
int main()
{
    int arr[] = {9,4,-1,-1,2,7,8,1,5,-1};
    int n = sizeof(arr)/sizeof(arr[0]);
    arrayRearrange(arr,n);

    return 0;
}
-1 1 2 -1 4 5 -1 7 8 9

arr [i]가 i와 같도록 배열을 재배 열하는 Java 프로그램

import java.util.Arrays;

class arrayRearrange
{
    public static void main(String[] args)
    {
        int[] arr = {9,4,-1,-1,2,7,8,1,5,-1};
        for (int i = 0; i < arr.length;)
        {
            if (arr[i] >= 0 && arr[i] != i)
            {
                int temp = arr[arr[i]];
                arr[arr[i]] = arr[i];
                arr[i] = temp;
            }
            else
            {
                i++;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}
[-1, 1, 2, -1, 4, 5, -1, 7, 8, 9]

복잡성 분석

시간 복잡성

어레이를 순회하고 있었기 때문에 선형 시간 복잡성을 달성했습니다. 의 위에) 어디에 "엔" "arr [i] = i가되도록 배열 재정렬"문제에 대한 배열의 요소 수입니다.

공간 복잡성

알고리즘 자체는 O (1) 상수 공간을 사용하지만 입력이 배열에 저장되기 때문입니다. 우리는 의 위에) 어디에 "엔" 배열의 요소 수입니다.