日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

找出数组中任一重复的数字

發(fā)布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 找出数组中任一重复的数字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

找出數(shù)組中任一重復(fù)的數(shù)字

找出數(shù)組中任一重復(fù)的數(shù)字

??在一個長度為 n 的數(shù)組 nums 里的所有數(shù)字都在 0~n-1 的范圍內(nèi)。數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾個數(shù)字重復(fù)了,也不知道每個數(shù)字重復(fù)了幾次。請找出數(shù)組中任意一個重復(fù)的數(shù)字。

示例 1:
輸入:[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3



低效解法

方法一

# python class Solution:def findRepeatNumber(self, nums):# 時間復(fù)雜度太高,O(N2)nums_set = set(nums)for i in nums_set:for j in nums:if i == j:nums.remove(j)break# nums包含所有重復(fù)元素return nums[0]

時間復(fù)雜度:O(N2)O(N^2)O(N2)
空間復(fù)雜度: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,時間復(fù)雜度為:O(nlogn)O(n log n)O(nlogn),空間復(fù)雜度為:O(n)O(n)O(n)
python sort函數(shù)內(nèi)部實現(xiàn)原理

時間復(fù)雜度:O(nlogn)O(n log n)O(nlogn)
空間復(fù)雜度:O(n)O(n)O(n)

方法三

基于HashSet,依次遍歷數(shù)組元素,插入集合中,如果無法插入,則為重復(fù)元素。

HashSet集合:不允許存儲重復(fù)的元素,查詢速度快

算法步驟

  • 初始化一個哈希表 (HashSet)
  • 遍歷數(shù)組中每一個元素,分別對每一個元素做如下的處理:
  • 將元素插入哈希表
  • 如果不可插入,則該元素為重復(fù)元素,返回該元素
  • 如果可插入,則判斷下一個元素
  • // 效率較低public int findRepeatNumber(int[] nums) {Set<Integer> set = new HashSet<Integer>();int repeat = 0;for (int i: nums) {if (!set.add(i)){repeat = i;break;}}return repeat;}

    時間復(fù)雜度:O(N)O(N)O(N)
    空間復(fù)雜度:O(N)O(N)O(N)



    算法步驟:

  • 初始化一個哈希表 (HashSet)
  • 遍歷數(shù)組中每一個元素,分別對每一個元素做如下的處理:
  • 先判斷哈希表中是否存在這個元素
  • 如果存在的話,則說明這個元素重復(fù),則直接返回
  • 否則,將這個元素加入到哈希表中,方便后續(xù)的判重
  • public int findRepeatNumber(int[] nums) {HashSet<Integer> set = new HashSet<Integer>();for (int i: nums) {// 判斷元素是否存在if (set.contains(i)) {return i;}set.add(i);}return -1;} }

    set.contains()、set.add()時間復(fù)雜度為O(N)
    Java:Set 的 contains() 方法 時間復(fù)雜度

    時間復(fù)雜度是:O(n)
    空間復(fù)雜度是:O(n)


    方法四:原地置換算法–目前的最優(yōu)解

    原地置換算法詳解及其應(yīng)用

    使用條件

  • 元素個數(shù)為n,元素值范圍為:[0,n-1]
  • 用于重復(fù)出現(xiàn)的數(shù),缺失的數(shù)等題目
  • 理解

    每個元素都有自己的位置(該元素的下標(biāo),如元素0的位置應(yīng)該是下標(biāo)為0),如果一組數(shù)(元素個數(shù)為n,元素值范圍為:[0,n-1])中缺失或重復(fù),則表現(xiàn)為有空位或位置重復(fù)匹配

    原地置換算法-視頻-作者:chefyuan

    思路

    • 判斷數(shù)組是否為空
    • 為空
    • 非空
      • 依次判斷該下標(biāo)對應(yīng)的元素是否為指定元素
        • 不在
          • 判斷該元素真正的位置在哪兒?
            • 相等(該元素和其真正位置上的元素相等)
              • 找到重復(fù)元素
            • 不等
              • 交換該元素和其正確位置上的元素
    // javapublic int findRepeatNumber4(int[] nums) {// 判斷數(shù)組為空是否需要?if (nums.length == 0){return -1;}for (int i = 0; i < nums.length; i++) {while (nums[i] != i){if (nums[i] == nums[nums[i]]){return nums[i];}int temp = nums[i];nums[i] = nums[temp];nums[temp] = nums[i];}}return -1;}

    TODO:分析
    時間復(fù)雜度:
    空間復(fù)雜度:

    # python轉(zhuǎn)寫if len(nums) == 0:return -1for i in range(len(nums)):while nums[i] != i:if nums[i] == nums[nums[i]]:return nums[i]temp = nums[i]nums[i] =nums[temp]nums[temp] = tempreturn -1 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的找出数组中任一重复的数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。