zoukankan      html  css  js  c++  java
  • 【Offer】[3-1] 【找出数组中重复的数字】

    题目描述

      在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3

    思路

    1. 排序后再查找 ❎
    2. 利用哈希表来解决问题,扫描数组中的数字,没扫到一个数字的时候将其加入哈希表中,如果哈希表中包含了该数字,那这个数字就是重复的数字。 ❎
    3. 注意到题目中要求所有的数字都在0~n-1的范围内,可以从哈希表的思路扩展,重新排列数组: 如果向数组中的数字存放到与该数字相等索引位置(交换两数),如果有一个索引位置重复,该数字遍为重复数字。✅

     

    Java代码

    public class Offer003_01 {
        public static void main(String[] args) {
    
            int[] arr = { 3, 5, 7, 8, 8, 6, 2, 4, 1 };
            int[] dupArr = new int[2];
            boolean duplicate = Offer003_01.duplicate(arr, dupArr);
            System.out.println(duplicate);
            System.out.println(dupArr[0]);
        }
    
        public static boolean duplicate(int[] arr, int[] dupArr) {
            return Solution1(arr, dupArr);
        }
    
        /**
         * 
         * 利用哈希表的思路扩展,重新排列数组
         * @param numbers  要传递的数组
         * @return   重复的数字
         */
        public static boolean Solution1(int[] arr, int[] dupArr) {
    
            if (arr == null || arr.length <= 0) {// 判断数组是否为空
                return false;
            }
            for (int i = 0; i < arr.length; i++) {// 判断数组中的数据是否超出范围
                if (arr[i] < 0 || arr[i] > arr.length - 1) {
                    return false;
                }
            }
            for (int i = 0; i < arr.length; i++) {
                while (arr[i] != i) {// 判断 当前元素与自身的下标i 是否相等 不相等的话进入循环
                    if (arr[i] == arr[arr[i]]) {// 判断当前元素 和
                        dupArr[0] = arr[i];
                        return true;
                    }
                    // 目的是为了 使 a[0]=0;a[1]=1 a[2]=2; [2,3,2,1] 的话 a[0] = a[a[0]] =a[2] =2
                    int temp = arr[i];
                    arr[i] = arr[arr[i]];
                    arr[temp] = temp;
                }
            }
            return false;
        }
    
    }
    

    代码链接

    剑指Offer代码-Java

  • 相关阅读:
    Linux(Unix)时钟同步ntpd服务配置方法(转载)
    Linux SSH Publickey登录!
    三个最短路算法
    三个最短路算法
    最大子列和问题
    哈密尔顿环
    最小生成树应用解(超时)蓝桥杯2015初赛]灾后重建
    最小生成树应用解(超时)蓝桥杯2015初赛]灾后重建
    c++11的记录
    最大子列和问题
  • 原文地址:https://www.cnblogs.com/haoworld/p/boffer31-zhao-chu-shu-zu-zhong-zhong-fu-de-shu-zi.html
Copyright © 2011-2022 走看看