我在这里有一个问题。 我试图在这个数组中找到第一个缺失的正数。 比如[1,2,0]答案应该是3。 代码是:
public static int firstMissingPositive(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
for(int i=0; i<A.length; i++){
while(A[i]>0 && A[i]<=A.length && A[i]!=i+1 && A[i]!=A[A[i]-1] ){
int temp=A[A[i]-1];
A[A[i]-1] = A[i];
A[i]=temp;
}
}
int index=0;
while(index<A.length && A[index]==index+1) index++;
return index+1;
}
这很有效。 而当我像这样改变代码中的交换函数时:
int temp=A[i];
A[i]=A[A[i]-1];
A[A[i]-1]=temp;
这次代码需要很长时间才能编译而不能正常工作。为什么? 解决方案就在这里。只是询问里面的交换功能。 您的算法应该在O(n)时间运行并使用恒定空间。 更新:@Bohemian你的答案是完全错误的!
答案 0 :(得分:3)
我想你想要这个:
int temp=A[i];
A[i]=A[i-1];
A[i-1]=temp;
您正在将数组值与索引混合。虽然从技术上来说你的代码是编译的,因为你的数组包含int
,但它不会做任何有用的事情,并且可能会因ArrayIndexOutOfBoundsException
而爆炸。
您可以考虑重命名数组变量以符合Java命名标准;以小写字母开头,例如numbers
作为思考的食物,我会像这样对数组进行排序:
Arrays.sort(A);
答案 1 :(得分:1)
如果我们观察到第二行和第三行A[i]
在第二行被更改并在第三行被重用。所以这会引发错误。
改为使用:
temp = A[i];
A[i] = A[A[i]-1];
A[temp-1] = temp;
temp
代替A[i]
将完美无缺。