美文网首页剑指offer
02_不修改数组找出重复数字

02_不修改数组找出重复数字

作者: 是新来的啊强呀 | 来源:发表于2020-05-17 11:23 被阅读0次

要求:

在一个长度为n+1的数组里的所有数字都在1到n的范围内。 数组中至少有一个数字是重复的,请找出数组中任意一个重复的数字,但不能修改输入的数组;

思路:

数组长度为n+1,而数字只从1到n,说明必定有重复数字。可以由二分查找法拓展:把1--n的数字从中间数字m分成两部分,若前一半1--m的数字数目超过m个,说明重复数字在前一半区间,否则,在后半区间m+1~n。每次在区间中都一分为二,知道找到重复数字。

public int getDuplication(final int[] numbers, int length){
        if(numbers == null||length<=0){
            return -1;
        }
        int start = 1;
        int end = length-1;
        while(end>=start){
//            int middle = ((end+start)/2);    // 相当于下式
            int middle = ((end-start)>>1)+start;  // 右移1位相当于处于2
            System.out.println("+++"+middle);   // 输出中间索引值
            int count = countRange(numbers,length,start,middle);  // 计算前半段的数目个数
            if(end == start){
                if(count>1){
                    return start;
                }else{
                    break;
                }
            }
            if(count>=(middle-start+1)){  // 若前一半1--m的数字数目超过m个,说明重复数字在前一半区间
                end = middle;
            }else{  // 否则在后半区
                start = middle+1;
            }

        }
        return -1;
    }
    // 计算numbers[]中start到end的数字的个数,例如[1,2,3,4,3]中属于1到4的数目为5个。
    public int countRange(int[] numbers,int length,int start,int end){
        if(numbers == null){
            return 0;
        }
        int count = 0;
        for(int i=0;i<length;i++){
            if(numbers[i]>= start && numbers[i]<=end){
                count++;
            }
        }
        return count;
    }
// 测试
public static void main(String[] args) {
        int[] arr= {2,3,5,4,3,2,6,7};
        L02_getDuplication gd = new L02_getDuplication();
        int d = gd.getDuplication(arr, arr.length);
        System.out.println(d);
    }

时间复杂度O(nlogn),其中(while循环为O(logn),coutRange()函数为O(n))

相关文章

  • 02_不修改数组找出重复数字

    要求:在一个长度为n+1的数组里的所有数字都在1到n的范围内。 数组中至少有一个数字是重复的,请找出数组中任意一个...

  • 《剑指Offer》之数据结构篇

    1. 长度为n数组,数字在 0~n-1 范围内,找出数组中任意一个重复的数 O(n) 2. 不修改数组找出重复数字...

  • 不修改数组找出重复的数字

    # 描述 在一个长度为 n+1 的数组中所有的数字都在 1~n 范围内,所以数组中至少有一个数字是重复的。请至少找...

  • 数组中重复的数(题目二)

    《剑指offer》面试题3:题目二:不修改数组找出重复的数字。 题目:在一个长度为n+1的数组里的所有数字都在1到...

  • java如何找出数组中的不重复数字

    java如何找出数组中的不重复数字 找出数组中不重复的一个数字,题目大致是这样的: 1int[] a = { 1,...

  • 剑指offer_数组中重复的数字

    找出数组中重复的数字 1、题目一:找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 ...

  • 14.不修改数组找出重复的数字

    思路:二分法,首先分析题目,数组长度是n+1,但是数据的范围是1-n,那么也及时说,必定会有一个重复的数字,并且按...

  • 14. 不修改数组找出重复的数字

    题目地址:https://www.acwing.com/problem/content/15/ AC代码——O(n...

  • 3.数组中重复的数字

    找出数组中任意一个重复的数字! 思路1:把数组排序,从排序后的数组中找出重复的数字。但排序一个长度为n的数组需要O...

  • 剑指offer题集

    [3] 数组中重复的数字 题目一:找出数组中重复的数字 Description 在一个长度为n的数组里的所有数字都...

网友评论

    本文标题:02_不修改数组找出重复数字

    本文链接:https://www.haomeiwen.com/subject/evvjohtx.html