找出数组中任一重复的数字
找出數組中任一重復的數字
找出數組中任一重復的數字
??在一個長度為 n 的數組 nums 里的所有數字都在 0~n-1 的范圍內。數組中某些數字是重復的,但不知道有幾個數字重復了,也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。
示例 1:
輸入:[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
低效解法
方法一
# python class Solution:def findRepeatNumber(self, nums):# 時間復雜度太高,O(N2)nums_set = set(nums)for i in nums_set:for j in nums:if i == j:nums.remove(j)break# nums包含所有重復元素return nums[0]時間復雜度:O(N2)O(N^2)O(N2)
空間復雜度:O(N)O(N)O(N)
一般解法
方法二
// java public int findRepeatNumber(int[] nums) {Arrays.sort(nums);int n = nums.length;int result = 0;for (int i = 0; i < n - 1; i++) {if (nums[i] == nums[i + 1]) {result = nums[i];break;}}return result; } # pythonnums.sort()for i in range(len(nums)-1):if nums[i] == nums[i+1]:return nums[i]python list sort() 基于排序算法Timsort,時間復雜度為:O(nlogn)O(n log n)O(nlogn),空間復雜度為:O(n)O(n)O(n)
python sort函數內部實現原理
時間復雜度:O(nlogn)O(n log n)O(nlogn)
空間復雜度:O(n)O(n)O(n)
方法三
基于HashSet,依次遍歷數組元素,插入集合中,如果無法插入,則為重復元素。
HashSet集合:不允許存儲重復的元素,查詢速度快
算法步驟
時間復雜度:O(N)O(N)O(N)
空間復雜度:O(N)O(N)O(N)
算法步驟:
set.contains()、set.add()時間復雜度為O(N)
Java:Set 的 contains() 方法 時間復雜度
時間復雜度是:O(n)
空間復雜度是:O(n)
方法四:原地置換算法–目前的最優解
原地置換算法詳解及其應用
使用條件
理解
每個元素都有自己的位置(該元素的下標,如元素0的位置應該是下標為0),如果一組數(元素個數為n,元素值范圍為:[0,n-1])中缺失或重復,則表現為有空位或位置重復匹配
原地置換算法-視頻-作者:chefyuan
思路
- 判斷數組是否為空
- 為空
- 非空
- 依次判斷該下標對應的元素是否為指定元素
- 在
- 不在
- 判斷該元素真正的位置在哪兒?
- 相等(該元素和其真正位置上的元素相等)
- 找到重復元素
- 不等
- 交換該元素和其正確位置上的元素
- 相等(該元素和其真正位置上的元素相等)
- 判斷該元素真正的位置在哪兒?
- 依次判斷該下標對應的元素是否為指定元素
TODO:分析
時間復雜度:
空間復雜度:
總結
以上是生活随笔為你收集整理的找出数组中任一重复的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于安装torch、torchvisio
- 下一篇: 两数之和--力扣