您好,登錄后才能下訂單哦!
這篇“Python不修改數組怎么找出重復的數字”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python不修改數組怎么找出重復的數字”文章吧。
在上一篇博客中劍指Offer之面試題3: 數組中重復的數字中,其實能發現這類題目的關鍵就是一邊遍歷數組一邊查滿足條件的元素。
然后我們在博客用最復雜的方式學會數組(Python實現動態數組)這篇博客中介紹了數組這一結構的本質,并自己動手實現了一個動態數組。
今天我們介紹一下另一道來自《劍指Offer》的關于數組的面試題——不修改數組找出重復的數字。
題目二:不修改數組找出重復的數字
給定一個長度為 n+1 的數組里的所有數字都在 0∼n 的范圍內,所以數組中至少有一個數字是重復的。
請找出數組中任意一個重復的數字,但不能修改輸入的數組。
樣例:
給定長度為8的數組 nums = [2, 3, 5, 4,3, 2, 6,7]
那么輸出重復的數字2或者3
首先我們得關注到,題目要求是:不修改數組,然后還是 返回任意一個重復的數字 。所以解題思路相比而言變少了:
1.哈希表:跟上一題一樣,本題也可以創建一個哈希表,如果原數組的每個數字第一次出現,就把他放到哈希表中去,即原數組大小為m的數字應該放到哈希表下標為m的位置上。空間復雜度是 $O(n)$ 。
2.二分法:那么有沒有不用空間復雜度 $O(n)$ 的算法。假設沒有重復數,那么1~n 之間,每個數都只能出現一次。而題目中,這個數組至少有一個數字重復,即出現的次數大于1。
利用二分的思想:把 1~n 的數字從中間數字 m 開始分為兩部分,前一半為 1~ m,后面一半為 m+1 ~n,如果 1~m 中的數字在數組中出現的次數大于 m,那么這一半必定有重復的數字;
否則,那么另一部分必定含有重復數字。接著我們,繼續對含有重復數字的區間一分為二,直到找到重復的數字。
def find_duplicated_num(nums): """hash_map""" hash_map = dict() for i, val in enumerate(nums): if val in hash_map: return val hash_map[val] = i return False
def reduce_inter(nums2, left, right): """ """ mid = (left + right) // 2 count = 0 length = len(nums2) for i in range(length): if (nums2[i] >= left) and (nums2[i] <= mid): count += 1 if count > mid - left + 1: return left, mid else: return mid+1, right def find_duplicated_num2(nums2): left, right = 1, len(nums2) - 1 while left != right: left, right = reduce_inter(nums2, left, right) return left
nums = [2, 3, 5, 4, 3, 2, 6, 7] # nums_n = [5, 4, 3, 2, 6, 7] print("思路一測試結果: ", find_duplicated_num(nums)) print("思路二測試結果: ", find_duplicated_num2(nums))
結果
思路一測試結果: 3
思路二測試結果: 3
以上就是關于“Python不修改數組怎么找出重復的數字”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。