劍指offer系列 50 陣列中重複的數字

2022-06-24 09:48:11 字數 1040 閱讀 5878

q:在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。

t:1.用hash。因為不用記錄數目,可以建立bool的陣列,bool占用空間更小。

2.把當前序列當成是乙個下標和下標對應值是相同的陣列;遍歷陣列,判斷當前位的值和下標是否相等: 2.1. 若相等,則遍歷下一位; 2.2. 若不等,則將當前位置i上的元素和a[i]位置上的元素比較:若它們相等,則成功!若不等,則將它們兩交換。換完之後a[i]位置上的值和它的下標是對應的,但i位置上的元素和下標並不一定對應;重複2.2的操作,直到當前位置i的值也為i,將i向後移一位,再重複2.

bool duplicate(int numbers, int length, int *duplication) 

for (int i = 0; i < length; i++) else }}

return false;

}

p.s.一開始交換寫錯了寫成了這:

int temp = numbers[i];

numbers[i] = numbers[numbers[i]];

numbers[numbers[i]] = temp;

於是就錯了……進了死迴圈

另注意,這樣出來的並不是第乙個重複的數字,而題目裡也是隨機乙個重複的數字即可。

3.題目裡寫了陣列裡數字的範圍保證在0 ~ n-1 之間,所以可以利用現有陣列設定標誌,當乙個數字被訪問過後,可以設定對應位上的數 + n,之後再遇到相同的數時,會發現對應位上的數已經大於等於n了,那麼直接返回這個數即可。

bool duplicate(int numbers, int length, int* duplication)               

numbers[index]+=length;

}return 0;

}

50 劍指offer 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。boolean只佔一位,所以還是比較省的 public boolea...

劍指offer系列 陣列中逆序對

題目描述 輸入乙個陣列,求出其中逆序對的總個數 示例 輸入 逆序對有,幾種情況 因此輸出5 分析 利用歸併排序的思想進行排序,時間複雜度o nlgn int inversepairscore vector nums,vector copy,int begin,int end int mid begi...

劍指Offer 50 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...