• 题目2:数组中重复的数字


    题目:长度为 n 的数组,里面所有数字都在 [0, n-1] 范围之内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复几次。

    要求:找出数组中任意一个重复的数字。

    示例:输入 n = 7 的数组 {2, 3, 1, 0, 2, 5, 3},则输出 2 或 3。

    题目链接

    思路

    1. 哈希表。
      • 遍历数组,将其中元素存入哈希表中,如果某个元素已经在哈希表中出现过,则其为重复数字。
      • 缺点:使用额外存储空间。
    2. 变形的排序。
      • 如果数组中无重复数字,则排序之后,numbers[i] = i,即数字 i 所在位置的下标也是 i,利用该特性对数组排序。排序过程中,如果某个位置的数字出现多个,该其为重复数字。
      • 算法:
        • 遍历数组,对于每个下标 i 的元素 numbers[i]:
          • 判断 numbers[i] 是否等于 i:
            1. 如果 numbers[i] == i,表明该元素出于排序后的最终位置,处理下一个元素。
            2. 如果 numbers[i] != i,则交换下标 i 和 numbers[i] 两个位置上的元素,交换之后,numbers[i] 处于其最终位置上。
          • 重复判断numbers[i] 是否等于 i,直到 numbers[i] == i。

    Java 实现

    public class Solution {
    	public boolean duplicate(int[] numbers, int length, int[] duplication) {
    		if (numbers == null || numbers.length <= 1)
    			return false;
    		
    		for (int i = 0; i < numbers.length; i++) {
    			while (numbers[i] != i) {  // 不断循环排序
    				if (numbers[i] == numbers[numbers[i]]) {  // 发现重复数字
    					duplication[0] = numbers[i];
    					return true;
    				}
    				
    				exch(numbers, i, numbers[i]);
    			}
    		}
    		
    		return false;
    	}
    	
    	private void exch(int[] n, int i, int j) {
    		int tmp = n[i];
    		n[i] = n[j];
    		n[j] = tmp;
    	}
    }
  • 相关阅读:
    [BZOJ4444][SCOI2015]国旗计划(倍增)
    [BZOJ4423][AMPPZ2013]Bytehattan(对偶图+并查集)
    [BZOJ4416][SHOI2013]阶乘字符串(子集DP)
    [BZOJ3203][SDOI2013]保护出题人(凸包+三分)
    [BZOJ4026]dC Loves Number Theory(线段树)
    51nod部分容斥题解
    [CodeVS4438]YJQ Runs Upstairs
    [HDU4906]Our happy ending
    牛客网NOIP赛前集训营-提高组(第四场)游记
    [BJWC2011]元素
  • 原文地址:https://www.cnblogs.com/satansk/p/5755279.html
Copyright © 2020-2023  润新知