1. 程式人生 > >劍指offer-陣列中的重複數字-不可改變輸入陣列(Java)

劍指offer-陣列中的重複數字-不可改變輸入陣列(Java)

文章目錄

題目描述

	在一個長為n+1的數組裡的所有數字都在1~n的範圍內,所以陣列中至少有一個數字是重複的,請找出陣列中任意一個重複的數字,但不能修改輸入的陣列。

示例

	輸入: {2, 3, 5, 4, 3, 2, 6, 7}
	輸出: 2或3

解析

	我們把從1~n的數字從中間的數字m分為兩部分,前面一半為1~m,後面一半為m+1~n,如果從1~m的數字的數目超過m,那麼這一半的區間裡一定包含重複數字,否則,另一半區間m+1~n一定包含重複的數字。這個過程與二分查詢很類似,只是多了一步統計區間裡數字的數目。
    public int getDuplication(int[] nums) {
        int length = nums.length;
        int start = 1;
        int end = length - 1;
        while(start <= end){
            int mid = ((end - start) >> 1) + start;
            int count = countRange(nums, length, start, mid);
            if(end == start){
                if(count > 1){
                    return start;
                }else {
                    break;
                }
            }
            if(count > (mid - start + 1)){
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }

        return -1;
    }
    public int countRange(int[] nums, int length, int start, int mid){
        if(nums == null){
            return 0;
        }
        int count = 0;
        for(int i=0; i<length; i++){
            if(nums[i] >= start && nums[i] <= mid){
                ++ count;
            }
        }
        return count;
    }