题目
重新排列一个数组,使得 arr[i] = i
给定一个长度为 N 的元素数组,范围从 0 到 N – 1。数组中可能不存在所有元素。 如果元素不存在,则数组中将存在 -1。 重新排列数组,使 A[i] = i,如果 i 不存在,则在该位置显示 -1。
Examples :
Input : arr = {-1, -1, 6, 1, 9, 3, 2, -1, 4, -1}
Output : [-1, 1, 2, 3, 4, -1, 6, -1, -1, 9]
方法1
static void fixArray(int[] ar, int n)
{
int i, j, temp;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if (ar[j] == i)
{
temp = ar[j];
ar[j] = ar[i];
ar[i] = temp;
break;
}
}
}
for(i = 0; i < n; i++)
{
if (ar[i] != i)
{
ar[i] = -1;
}
}
}
时间复杂度 : O(n^2)
方法2
public static int[] fix(int[] A)
{
for (int i = 0; i < A.Length; i++)
{
if (A[i] != -1 && A[i] != i)
{
int x = A[i];
while (A[x] != -1 && A[x] != x)
{
int y = A[x];
A[x] = x;
x = y;
}
A[x] = x;
if (A[i] != i)
{
A[i] = -1;
}
}
}
return A;
}
时间复杂度 : O(n)
空间复杂度 : O(1)
方法3
1)将数组中存在的所有数字存储到一个集合中
2)遍历数组的长度,如果对应的位置元素存在于Set中,则设置A[i] = i,否则A[i] = -1
static void fix(int[] a,int n)
{
HashSet<int> hs=new HashSet<int>();
for(int i=0;i<n;i++)
hs.Add(a[i]);
for(int i=0;i<n;i++)
{
if(hs.Contains(i))
a[i]=i;
else
a[i]=-1;
}
}
时间复杂度 : O(n)
空间复杂度 : O(n)