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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer03.数组中重复的数字

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer03.数组中重复的数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

劍指offer03.數組中重復的數字

      • 題目
      • 第一種解法
      • 第二種解法
      • 第三種解法
      • 值得一提的東西

題目

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

示例 1:

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

第一種解法

一個簡單的暴力方法就是先把輸入的數組排序.從排序的數組中找出重復的數字是一件容易的事情,只需要判斷一個數字的下一個數字是否與本身相等即可
.但是排序一個長度為n的數組需要O(nlogn)的時間
時間復雜度較高,不可取

第二種解法

使用哈希表來解決這個問題.從頭到尾按順序掃描這個數組的每個數字.
每掃描到一個數字的時候.都可以用O(1)的時間來判斷哈希表中是否存在了這個數字. 如果哈希表中沒有這個數字就把他加入進去,下次再判斷時就能找出來
時間復雜度 : O(n)
空間復雜度 : O(n)提高了時間復雜度的前提下是犧牲了一個大小為O(n)的哈希表為代價的

// 使用哈希表來儲存數組中數字出現的次數 func findRepeatNumber(nums []int) int{// 先建造一個map, key為int類型存數組里面的值,value為bool類型存真假m := make(map[int]bool)// for range nums 取出值并且判斷是否在哈希表里面存在// 若沒有存在那么就是把這個值設為key,value設為true// 若下次再出現了這個值,那么就可以返回這個值了for _, num := range nums{if _,exist := m[num]; exist{return num}m[num] = true}return -1 }

第三種解法

有沒有一種空間上為O(1)的更高效的解法呢?
在一個長度為 n 的數組 nums 里的所有數字都在 0 ~ n-1 的范圍內 。
此說明含義:數組元素的 索引 和 值 是 一對多 的關系。
因此,可遍歷數組并通過交換操作,使元素的 索引 與 值 一一對應(即 nums[i] = i )。因而,就能通過索引映射對應的值,起到與字典等價的作用。
遍歷中,第一次遇到數字 x 時,將其交換至索引 x 處;而當第二次遇到數字 x 時,一定有 nums[x] = x ,此時即可得到一組重復數字。

算法流程:
遍歷數組 nums ,設索引初始值為 i=0 :

若 nums[i]=i : 說明此數字已在對應索引位置,無需交換,因此跳過;
若 nums[nums[i]] = nums[i] : 代表索引 nums[i] 處和索引 ii 處的元素值都為 nums[i] ,即找到一組重復值,返回此值 nums[i] ;
否則: 交換索引為 i 和 nums[i] 的元素值,將此數字交換至對應索引位置。
若遍歷完畢尚未返回,則返回 ?1 。

func findRepeatNumber2(nums []int) int {// 效驗參數的合法性if len(nums) <= 0 {return -1}for i := 0;i < len(nums);i++ {if nums[i] < 0 || nums[i] > len(nums) - 1{return -1}}var tmp int = 0for i := 0;i < len(nums);i++ {for nums[i] != i {if nums[i] == nums[nums[i]] {return nums[i]}tmp = nums[i]nums[i] = nums[tmp]nums[tmp] = tmp}}return -1 }

值得一提的東西

測試用例可能包含無效測試用例
如輸入長度為n的數組中包含(0~n-1)之外的數字
傳入空數組等等
所以我們需要先進行參數的校驗合法性

總結

以上是生活随笔為你收集整理的剑指offer03.数组中重复的数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。