- 题目详述
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]
二.自我探寻
思路:不使用额外空间,则在原数组上保存
1次为0 ,2次为-1,在数组中“跳跃”循环
代码:public static List<Integer> findDuplicates(int[] nums) {
List<Integer> a=new ArrayList<Integer>();
for(int t=0;t<nums.length;t++)
{ if(nums[t]<=0)
continue;
int n=nums[t];
while(true)
{
if(nums[n-1]>0)
{
if(n-1>t)
{
int q=nums[n-1];
nums[n-1]=0;
n=q;
}
else
{
nums[n-1]=0;
break;
}
}
else if(nums[n-1]==0)
{
nums[n-1]=-1;
a.add(n);
break;
}
else {
break;
}
}
}
return a;
}
评价:
三.网络学习过程
出现一次的话将原位变成负数,在保留出现一次的同时,不破坏位置存储数的信息,因此不必“跳跃”
代码:
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> ans = new ArrayList();
for(int i=0;i<nums.length;i++){
int t = Math.abs(nums[i])-1;
if(nums[t]<0){
ans.add(Math.abs(nums[i]));
}else
nums[t] = -1* ( nums[t]);
}
return ans;
}
}
评价:
四.Python实现