数组中重复的数据

博客给出一个整数数组,要求找出其中出现两次的元素,且不用额外空间并在O(n)时间复杂度内解决。给出样例输入[4,3,2,7,8,2,3,1],输出[2,3],并分析了解题方法,即若nums[i]!=i+1,将nums[i]存到对应下标处等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?

样例:

输入:[4,3,2,7,8,2 ,3,1]
输出:[2,3]

分析:

这道题和上一题的解法一致,如果nums[i]!=i+1,则将nums[i]存放到其对应的下标处,如果该下标中的元素和nums[i]相等,证明该元素重复加入列表并将nums[i]置为-1,否则会重复添加。如果不相等则将i位置处的元素和nums[i]-1处的元素交换位置。

    public List<Integer> findDuplicates(int[] nums) {
		List<Integer> list=new ArrayList<>();
        if(nums==null||nums.length==0)
        	return list;
        for(int i=0;i<nums.length;i++) {
        	while(nums[i]!=-1&&nums[i]!=i+1) {
        		int index=nums[i];
        		if(nums[index-1]==index) {
        			list.add(index);
        			nums[i]=-1;
        			break;
        		}else {
        			int temp=nums[index-1];
        			nums[index-1]=index;
        			nums[i]=temp;
        		}
        	}
        }
        return list;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值