劍指 Offer 03 陣列中重複的數字

2022-09-21 17:21:14 字數 1962 閱讀 8139

劍指 offer 03. 陣列中重複的數字

首先可以注意到陣列長度為n,所有的元素都在0~n-1之間,所以可以開乙個長為n的陣列用來記錄每個元素的次數,當某乙個元素的出現頻率大於2時,說明這是重複的,可以返回

class solution 

// 記錄0~n-1範圍的數出現的頻率

int map = new int[n];

for(int i = 0; i < n; i++)

}return 0;}}

這裡由於資料的範圍可以確定在0~n-1,所以可以不用使用雜湊表,因為雜湊表有擴容和複製操作,時間上會更長。

時間複雜度為o(n),空間複雜度為o(n)

還可以進行排序,如果有重複元素,那麼肯定是在相鄰處。

class solution 

quicksort(nums, 0, n - 1);

for(int i = 0; i < n - 1; i++)

}return 0;

}public void quicksort(int nums, int l, int r)

} quicksort(nums, l, j);

quicksort(nums, j + 1, r);}}

快速排序的時間複雜度為o(nlogn),空間複雜度為o(1)

也可以使用set來儲存陣列中的所有元素,嘗試把nums中的每個元素都加入到set中,如果新增失敗,則說明這是乙個重複元素,不能新增。

class solution 

return -1;}}

時間複雜度為o(n),空間複雜度為o(n)

當然還有空間複雜度更低的解法,不過自己確實沒有想出來,是看完了題解之後想出來的。

因為我們已經得知數的範圍是在0~n-1,且對於給定的陣列,索引範圍也是在0~n-1,又因為有重複元素,所以肯定有索引和值的一對多關係,那麼我們可以遍歷所有值,以值為索引,那麼有如下情況:

①.nums[i] = i,說明此數字已經放在了對應的位置,無需交換;

②.nums[nums[i]] = nums[i],說明索引nums[i]和索引i處的值都為nums[i],找到了一組重複的值,因此返回值nums[i]

③.都不等時,交換索引inums[i]的元素值,將數字交換到對應的索引位置處。

但是這裡需要注意寫法,只有當nums[i] = i時,我們才遞增i,否則持續交換,直到nums[i]i不等且兩個指標指向的數相同時,說明是重複元素,返回即可。

class solution 

if(nums[nums[i]] == nums[i]) return nums[i];

int tmp = nums[i];

nums[i] = nums[tmp];

nums[tmp] = tmp;

}return -1;}}

時間複雜度為o(n),空間複雜度為o(1)

劍指offer03 陣列中重複的數字

在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3限制 2 n 100000 首先拿到這道題最先想到的是...

劍指Offer03 陣列中重複的數字

劍指offer典型題整理 爭取做最好的題解 題目描述 在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限...

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

找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限制 2 n 100000 首...