《剑指offer-第二版》-面试题03-数组中重复的数字-01-找出数组中重复的数字(Java)


点击查看: 《剑指offer-第2版》 全部面试题 详解目录(Java版)


题目一: 找出数组中重复的数字

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

  • 思路一: 先排序,在比较。思路简单,时间复杂度为O(nlogn)
  • 思路二: 利用哈希表解决,每次向哈希表中存放数据 并比较是否存在, 时间复杂度为O(n),空间复杂度为O(n)
  • 思路三: 手动重排,将数组元素放在和其大小对应的下标处。 若该元素现在和数组下标相同 则扫描下一个元素,若不相同 (且对应目标下标处的元素和该元素相同,则发现重复元素若不同则交换两数位置) 时间复杂度为 O(n)

思路三的代码实现:
代码中尽管有一个双循环,但每个数字最多只要减缓两次就能找到属于它自己的位置
因此总的时间复杂度为 O(n) , 空间复杂度为 O(1)

package ch02;/** * @author Ren */public class T03_1_找出数组中重复的数字 {    public static void main(String[] args) {        // 定义一个数组        int [] arr = {2,3,1,0,2,5,3};        // 调用判断方法        duplicate(arr,arr.length);    }    /**     * 代码中尽管有一个双循环,但每个数字最多只要减缓两次就能找到属于它自己的位置     * 因此总的时间复杂度为 O(n) , 空间复杂度为 O(1)     * @param arr     * @param length     * @return     */    public static boolean duplicate(int arr[], int length){        //先判断数组是否为空、        if(arr==null || length<=0){            return false;        }        //遍历数组,如果存在元素 小于0 或 大于数组索引 的情况则不符合题意        for (int i = 0; i < length; i  ) {            if(arr[i] <0 || arr[i]>=length) {                return false;            }        }        //其他情况 即:符合题意的情况        for (int i = 0; i < length; i  ) {            while (arr[i] != i){                // 如果当前元素 不等于当前索引,并且: 目标索引等于目标索引上的元素,则发现相等元素                if(arr[i]==arr[arr[i]]){                    System.out.println(arr[i]);                    return true;                }                //当前元素 不等于当前索引,并且: 目标索引不等于目标索引上的元素                int temp = arr[i]; arr[i] = arr[arr[i]]; arr[temp]=temp;            }        }        return false;    }}

来源:https://www.icode9.com/content-1-852551.html

(0)

相关推荐

  • 数组时间复杂度

    链接: https://www.nowcoder.com/questionTerminal/758a224f6f5a4d24b59c30315cab573e .... 访问数组中第n个元素,花费O(1 ...

  • 图解:什么是堆排序?

    二叉堆(Binary Heap)是一颗特殊的完全二叉树,一般分为大顶堆和小顶堆,我就不啰嗦啦!具体内容你可以看一下 图解:什么是二叉堆? 堆排序 要学习今天的堆排序(Heap Sort),我们以一个数 ...

  • 剑指offer笔记面试题2----实现Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...

  • 剑指offer计划5(查找算法中等版)---java

    剑指offer计划5(查找算法中等版)---java 1.1.题目1 剑指 Offer 04. 二维数组中的查找 1.2.解法 其实就是暴力解法的升级版,从最后一行开始判断,通过num当前的大小, 如 ...

  • 剑指offer计划7(搜索与回溯算法简单版)---java

    1.1.题目1 剑指 Offer 26. 树的子结构 1.2.解法 这题看了解法,感叹真的6,代码量减了很多. (A != null && B != null) && ...

  • 台球|世界第一剑指世锦赛第二冠,2冠军火爆对轰,特鲁姆普4-4战平墨菲

    世界第一剑指世锦赛第二冠,2冠军火爆对轰,特鲁姆普4-4平墨菲 北京时间4月28日消息,2021斯诺克世锦赛继续进行1/4决赛的争夺.一场焦点比赛中,夺冠最大热门.世界第一贾德-特鲁姆普打出一杆破百两 ...

  • 【剑指Offer】数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 解法1 最直接的思路,计算base的 ...

  • 【剑指Offer】链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解法 基本思路是使用两个辅助指针p, q,让p先走k - 1步后,p, q两个指针再一起走 这样当p指针走到链表的末尾时,q指针刚好走到的就是倒数 ...

  • 【剑指Offer】反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 解法1 可以使用三个辅助指针pHead, last,next pHead记录当前节点,last记录上一个节点,next记录下一个节点 首先使用n ...

  • 剑指 Offer 14- I. 剪绳子

    我服了.动态规划杀我. 可以说一说解决动态规划的思路(只做了两三道就总结了emmm) 1.识别动态规划问题 --重叠子问题:大问题可以分为一个个子问题.和分治策略分割的子问题不同(分治问题的子问题是相 ...

  • 剑指offer

    03 数组中重复的数字 public int findRepeatNumber(int[] nums){ //排序后的数组,重复元素必然相邻 Arrays.sort(nums); //结果集 int ...