一个数组长度为N,元素分别为0-到n-1;已经知道存在重复元素;返回重复元素;要求时间O(N);空间O(1);
public int duplicate(int numbers[], int length, int [] duplication) {
if (numbers == null || length == 0) {
return false;
}
for (int i = 0; i < length; i++) {
while (numbers[i] != i) {
if (numbers[i] == numbers[numbers[i]]) {
duplication[0] = numbers[i];
return duplication[0] ;
}
else {
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
}
return duplication[0];
}
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]
思路:首先给出的数组数值范围是1-n;要求不用空间;所以我们可以比较交换将该数值交换到合适的位置;
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> res=new ArrayList<Integer>();
for(int i=0;i<nums.length;i++)
{
//将索引得值放到对应的下标下面
if(nums[i]!=nums[nums[i]-1])
{
int temp=nums[nums[i]-1];
nums[nums[i]-1]=nums[i];
nums[i]=temp;
i--;
}
}
for(int i=0;i<nums.length;i++)
if(nums[i]!=i+1)
res.add(i+1);
return res;
}