AcWing14:找出数组中重复的数字

Posted 劭兮劭兮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing14:找出数组中重复的数字相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

问题

原题链接

原题链接找出数组中重复的数字
在这里插入图片描述

个人思路

自己思路

双层for循环,把整个数组遍历一遍,每一个元素都与其后面的元素比较,如果有相等的元素,结束循环;
在这里插入图片描述

java实现
class Solution {

    public static void main(String[] args) {
		int[] nums = {2,3,5,4,3,2,6,7};
		duplicateInArray(nums);
	}
	
	public static int duplicateInArray(int[] nums) {
		int n = nums.length;
		
		for(int i = 0;i<n;i++) {
			if(nums[i]<0 || nums[i]>n-1) {
        		return -1;
        	}
		}
		
        for(int i = 0;i<n-1;i++) {
        	for(int j = i+1;j<n;j++) {
        		if(nums[i] == nums[j]) {
        			return nums[i];
        		}
        	}
        }
        return -1;
    }
}
C++实现
class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int n = nums.size();
        for(auto x : nums){
        	if(x<0 || x>n-1){
        		return -1;
			}
		}
		
		for(int i = 0;i<n-1;i++){
			for(int j = i+1;j<n;j++){
				if(nums[i] == nums[j]){
					return nums[i];
				}
			}
		}
		return -1;
    }
};

大佬思路

(自己的解题思路比较菜,所以一般会学习一下大佬的思路)在这里插入图片描述
在这里插入图片描述

循环遍历整个数组,
因为所有数字都在0——n-1的范围内,
数组下标范围也是0——n-1,
所意我们试图把所有数字都放在与其数组下标相对应的位置上,
使 nums[i] = i;(左边的i指的是数组下标,右边的i指的是数组nums的一个元素)

每一次交换,都能使一个元素放在正确的位置上,
跳出while循环的条件是:nums[i] = x;
nums[x] = x;
此时,nums[x] = x,并且nums[i] = x;
所以,很明显 x 重复了,则返回nums[i],即返回x;

在这里插入图片描述

java实现
package com.yangping.acwing;

public class Second {

	public static void main(String[] args) {
		int[] nums = {2,3,5,4,3,2,6,7};
		int n = duplicateInArray(nums);
		System.out.println(n);
	}
	
	public static int duplicateInArray(int[] nums) {
		int n = nums.length;
		
		for(int i = 0;i<n;i++) {
			if(nums[i]<0 || nums[i]>n-1) {
//        		System.out.println(-1);
        		return -1;
        	}
		}
		
		int temp = 0;
		
        for(int i = 0;i<n;i++) {
        	while (nums[nums[i]] != nums[i]) {
        		temp = nums[nums[i]];
    			nums[nums[i]] = nums[i];
    			nums[i] = temp;
    			
//    			输出交换后的数组
//    			for(int num : nums) {
//    				System.out.print(num);
//    			}
//    			System.out.println("交换成功!");
    			
        	}
            if (nums[i] != i && nums[nums[i]] == nums[i]) {
            	return nums[i];
            }
        }
        return -1;
    }

}

C++实现
class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int n = nums.size();
        for(auto x : nums){
        	if(x<0 || x>n-1){
        		return -1;
			}
		}
		
		for(int i = 0;i<n;i++){
			while(nums[nums[i]] != nums[i]){
				swap(nums[nums[i]],nums[i]);
			}
			if(nums[i] != i){
				return nums[i];
			}
		}
		return -1;
    }
};
C实现
int duplicateInArray(int *nums, int numsSize){
    for(int i = 0;i<numsSize;i++){
    	if(nums[i] < 0 || nums[i] > numsSize-1){
    		return -1;
		}
	}
	
	int temp = 0;
	
	for(int i = 0;i<numsSize;i++){
		while(nums[nums[i]] != nums[i]){
			temp = nums[nums[i]];
			nums[nums[i]] = nums[i];
			nums[i] = temp;
		}
		if(nums[i] != i){
			return nums[i];
		}
	}
	return -1;
}

注意:

  • for循环中if条件判断
    在这里插入图片描述

  • 数组中交换变量,借助外部变量时需要注意
    在这里插入图片描述
    欢迎小伙伴们可以一起探讨问题,加油!

以上是关于AcWing14:找出数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

AcWing15:不修改数组找出重复的数字

AcWing15:不修改数组找出重复的数字

ACwing13题

[题目2]不修改数组找出重复的数字

AcWing 799. 最长连续不重复子序列

14. 不修改数组找出重复的数字难度: 一般 / 知识点: 抽屉原理 二分