劍指offer-陣列中的重複數字-不可改變輸入陣列(Java)
阿新 • • 發佈:2018-11-07
文章目錄
題目描述
在一個長為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; }