public boolean duplicate(int numbers,int length,int duplication)
arrays.sort(numbers);
for(int i=0;i下面來看看乙個比較,交換的過程
原始陣列:
第一次 i=0:
//陣列第0個元素是2,與下標不等,然後與下標為2的1交換
//陣列第0個元素是1,與下標不等,然後與下標為1的3交換
//陣列第0個元素是3,與下標不等,然後與下標為3的0交換
第二次 i=1:
//二三四次都與下標相等
第三次 i=2:
第四次 i=3:
第五次 i=4
掃瞄到下標為4的數字2,與比較下標為2的數字2進行比較,相等,找到乙個重複數字
**如下:
public boolean duplicate(int numbers,int length,int duplication)
for(int i=0;ilength-1)
}
for(int i=0;iarr.length-1)
}int arr1 =new int[length];
int n=0;
for(int i=0;iarr.length-1)
}int low=1;
int high=arr.length-1;
int mid,count;
while (low<=high)
if(count>mid-low+1)
else
}return -1;
}/**
* 判斷這個範圍內數字出現的次數
* @return
*/private static int countrange(int arr, int low, int high)
int count=0;
for(int a:arr)
}return count;
}
如果輸入的長度為n的陣列,那麼函式countrange將會被呼叫o(logn)次,每次需要o(n)的時間,因此總的時間複雜度是o(nlogn)。空間複雜度是o(1)。
這個演算法不能保證找出所有的重複數字。例如不能找到陣列中的重複數字2。這是因為在1~2的範圍內有1和2兩個數字,這個範圍的數字也出現了2次。使用這個演算法不能確定是每個數字各出現一次還是某個數字出現了兩次。
劍指offer 陣列中的重複數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。輸入 輸出 2或3從頭到尾依次掃瞄這個陣列中的每個數字,當掃瞄到下標為i的數字時,首先比較這個數字 用m表示 是不是等於i。如果是,則...
劍指offer 陣列中的重複數字
題目 陣列中的重複數字。在乙個長度為n的陣列裡所有的數字都在0 n 1範圍,陣列中某些數字是重複的,但是不知道有幾個數字重複了,請找出陣列中任意乙個重複的數字。例如 長度為7的陣列 2,3,1,2,5,3 重複的數字是2或者3。分析 方法 1 用兩層for迴圈,拿著每乙個資料與剩下的每乙個比較,看看...
劍指offer 陣列中的重複數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。首先,必須對陣列進行遍歷,在遍歷過程中,在基於雜湊表實現的unord...