劍指offer03 陣列中重複的數字

2021-10-24 17:19:32 字數 2452 閱讀 3842

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

難度:簡單

找出陣列中重複的數字。

在乙個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。

示例 1:

輸入:

[2, 3, 1, 0, 2, 5, 3]

輸出:2 或 3

限制:

2 <= n <= 100000

可以利用雜湊表解決這個問題,

從頭到尾按順序掃瞄陣列的每個數字,每掃瞄乙個數字的時候,都可以用o(1) 的時間來判斷雜湊表裡是否已經包含了該數字。

如果雜湊表裡還沒有這個數字,就把他加入到雜湊表。

如果雜湊表已經存在該數字,就找到乙個重複的數字。

這個演算法的時間複雜度是o(n),但它提高時間效率是以乙個大小為o(n)的雜湊表為代價的。

class solution 

return -1;

}}

空間複雜度o(1)

所有操作步驟都是在輸入陣列上進行的,不需要額外分配記憶體,因此空間複雜度為o(1)

我們注意到,陣列中的數字都在0~n-1的範圍內。如果這個陣列中沒有重複的數字,那麼當陣列排序之後,數字 i 將出現在下標 i 的位置。由於陣列中有重複的數字,有些位置可能存在多個數字,有些位置可能沒有數字。

思路:

重排這個陣列,

從頭到尾依次掃瞄這個陣列的每乙個數字。開始迴圈 for (int i = 0; i < nums.length; i++)當掃瞄到下標為  i 的數字時,首先比較這個數字(用m表示)是不是等於 i 。比較 nums[i] 與 i 是否相等如果是,則接著掃瞄下乙個數字。如果nums[i] == i ,continue,如果不是,則再拿它和第m個數字進行比較。如果 nums[i] !=  i  ,比較nums[i] 和 nums[nums[i]]如果它和第m個數字相等,就找到了第乙個重複的數字(該數字在下標為 i 和 m 出都出現了)。如果相等,返回nums[i]如果它和第m個數字不相等,就把第i個數字和第m個 數字交換,把m放到屬於它的位置。如果不相等,交換nums[i] 和 nums[nums[i]]位置   (有個小坑)

接下來再重複這個比較,交換的過程,直到我們發現乙個重複的數字。結束迴圈

2 3 1 0 2 5 3

1 3 2 0 2 5 3    第1次交換了第 0 處的 2 和 第 2 處的 1

1 0 2 3 2 5 3    第2次交換了第 1 處的 3 和 第 3 處的 0

1 0 2 3 2 5 3    第3次,第 2 處的 2  此時 i=nums[i] ,保持不變,繼續下次迴圈

1 0 2 3 2 5 3    第4次,第 3 處的 3  此時 i=nums[i] ,保持不變,繼續下次迴圈

1 0 2 3 2    ------> 輸出nums[2] = 2       第5次,第 4 處的 2  與 第 2 處的 2 相等,即出現了第乙個重複的數字

public int find2(int nums)

else if (nums[i] == nums[nums[i]])

// int a = nums[i];

// nums[i] = nums[nums[i]];

// nums[nums[i]] = a;

int a = nums[i];

nums[i] = nums[a];

nums[a] = a;

}return -1;

}

注意:在交換交換nums[i] 和 nums[nums[i]]位置時,注意寫法。

public int find2(int nums)

int a = nums[i];

nums[i] = nums[a];

nums[a] = a;}}

return -1;

}

每個數字最多交換兩次就能找到屬於自己的位置

也可以變成乙個排序的小演算法

public int find2(int nums)

}return nums;

}

劍指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 首...