假設你有一個用1001個整數組成的數組,這些整數是任意排列的,但是你知道所有的整數都在1到1000(包括1000)之間。此外,除一個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個數組做一次處理,用一種算法找出重復的那個數字。如果你在運算中使用了輔助的存儲方式,那么你能找到不用這種方式的算法嗎?
方法一:使用輔助存儲方式
使用hash存儲方式,以1到1000作為hash表的索引,遍歷原數組,統計各數字出現的個數並存儲到以該數字為索引值的hash表中,若某個hash[x]的值為2則退出循環,x就是重復出現兩次的數字。時間復雜度最壞是O(n)。優點:高效率,缺點:消耗的內存空間過大
1 int fun1(const int a[]) 2 { 3 int hash[1001]={0}; 4 int x=0; 5 for(int i=0;i<1001;i++) 6 { 7 if((++hash[a[i]])==2) 8 { 9 x=a[i]; 10 break; 11 } 12 13 } 14 return x; 15 }
方法二:不使用輔助存儲方式
1 int fun2(const int a[]) 2 { 3 int s1=0; 4 int s2=(1+1000)*1000/2; 5 for(int i=0;i<1001;i++) 6 { 7 s1+=a[i]; 8 } 9 return s1-s2; 10 }