算法題 如何找到數組中重復的數字

面試題3 數組中重復的數字

  • 題 目 :找出數組中重復的數字。
  • 在一個長度為n的數組里的所有數字都在0 ~ n-1的范圍內。數組中某些數字是重復的,但不知道有幾個數字重復了,也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。例如,如果輸入長度為7 的數組{2,3, 1,0, 2, 5, 3} , 那么對應的輸出是重復的數字2 或者3。
  • 先把輸入的數組排序。從排序的數組中找出重復的數字是一件很容易的事情,只需要從頭到尾掃描排序后的數組就可以了。排序一個長度為n的數組需要O(nlogn)的時間
  • 還可以利用哈希表來解決這個問題。從頭到尾按順序掃描數組的每個數字,每掃描到一個數字的時候,都可以用0(1)的時間來判斷哈希表里是否已經包含了該數字。如果哈希表里還沒有這個數字,就把它加入哈希表。如果哈希表里已經存在該數字,就找到一個重復的數字。這個算法的時間復雜度是0(n),但它提高時間效率是以一個大小為o(n)的哈希表為代價的。
  • 我們再看看有沒有空間復雜度是0(1)的算法。如果這個數組中沒有重復的數字,那么當數組排序之后數字i將出現在下標為 i 的位置。由于數組中有重復的數字,有些位置可能存在多個數字,同時有些位置可能沒有數字。
  • 現在讓我們重排這個數組。從頭到尾依次掃描這個數組中的每個數字。當掃描到下標為i的數字時,首先比較這個數字(用m表示)是不是等于i. 如果是,則接著掃描下一個數字;如果不是,則再拿它和第 m 個數字進行比較。如果它和第m個數字相等,就找到了一個重復的數字(該數字在下標為i和m 的位置都出現了);如果它和第m個數字不相等,就把第i個數 字和第m個數字交換,把m 放到屬于它的位置。接下來再重復這個比較、 交換的過程,直到我們發現一個重復的數字
  • 例子:數組{2,3,1,0,2,5,3};數組的第0個數字(從0開始計數)是2,與他的下標不匹配,因此將a[0]元素指定的坐標2互換,換完之后的結果是{1,3,2,0,2,5,3};這個時候0號元素是1,仍然和小標不匹配,繼續更換;更換之后的結果是{3,1,2,0,2,5,3};接下來繼續交換第0號元素和第3號元素,{0,1,2,3,2,5,3};0號元素、1號元素、2號元素、3號元素均匹配,當4號元素對應的數值是2和2號元素重復,因此找到了一個重復的數字
class Solution {
public:int findRepeatNumber(vector<int>& nums) {int length = nums.size();/*   if (length < 0){return -1;}for (int i = 0; i < length; ++i) {if (nums[i] < 0 || nums[i] > length){return false;}}*/for (int i = 0; i < length; i++) {while (nums[i] != i){if (nums[i] == nums[nums[i]]){return nums[i];} else{int temp = nums[i];nums[i] = nums[temp];nums[temp] = temp;}}}return -1;}
};
  • Leetcode對應的題目地址

第二種解法

  • 使用map,第一次遍歷元素,key是元素的本身數值,value是元素出現的次數,存儲所有的元素和出現次數的相關信息
  • 第二次遍歷元素,查找元素出現的次數大于等于2的,返回對應的元素
    int findRepeatNumber_3(std::vector<int>& nums) {std::map<int,int> map{};int length = nums.size();for (int i = 0; i < length; ++i) {map[nums[i]]++;}for (auto i = map.cbegin(); i != map.cend(); ++i) {if (i->second == 2){return i->first;}}return -1;}

第三種解法

  • 使用無需map,將元素加入map的時候就要判定,是不是之前已經存在了此元素,如果存在此元素,將其返回
    int findRepeatNumber_2(std::vector<int>& nums) {std::unordered_map<int,int> map{};int length = nums.size();for (int i = 0; i < length; ++i) {if (map.find(nums[i]) != map.end()){return nums[i];} else{map[nums[i]]++;}}return -1;}

第四種解法

  • 將元素按照次序進行排序,然后判斷相鄰元素是否相等,如果相等則將其返回

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446490.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446490.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數學建模5 代碼論文降重 Excel表處理數據

代碼降重 1&#xff09;在代碼中加入自己的注釋 2&#xff09;替換變量名&#xff0c;a->jude 3&#xff09;代碼中英文使用很小的字母&#xff0c;再顏色透明化&#xff08;慎用&#xff09; 文章降重 1&#xff09;模型介紹&#xff0c;優缺點等網上容易查到的內容自己…

C++ Map簡單介紹 ,比如添加元素、刪除元素和打印元素

介紹 map是一種鍵值對容器&#xff0c;第一個數值為關鍵字&#xff08;key&#xff09;&#xff0c;第二個數值為該元素對應的出現的次數。如果是map&#xff0c;key只會出現一次&#xff0c;如果是unordered_map&#xff0c;無此限制。此外&#xff0c;map會對元素進行排序&a…

Python學習1 基礎語法 數據類型 計算機基礎

Python的重要性 python就業方向 Python的歷史 python創造于1989年&#xff0c;荷蘭人吉多.范羅蘇姆 現在是Python3版本 09 Python的特點 1&#xff09;跨平臺 2&#xff09;解釋型語言 3&#xff09;交互式 4&#xff09;面向對象&#xff1a;一切皆對象 5&#xff09;具有一…

算法考題 替換空格

參考鏈接 letcode官網題目地址 題目要求&#xff1a; 請實現一個函數&#xff0c;把字符串 s 中的每個空格替換成"%20"。示例 1&#xff1a; 輸入&#xff1a;s "We are happy." 輸出&#xff1a;"We%20are%20happy." 來源&#xff1a;力扣&a…

Python學習2 條件判斷語句if,循環語句for while

順序&#xff0c;分支&#xff0c;循環結構 條件判斷語句if 1&#xff09;if…else… 2) if…elif…else 注意&#xff1a; 1&#xff09;python中不支持switch…case語句 2&#xff09;注意縮進&#xff01; 3&#xff09;區間范圍內允許連續比較&#xff1a; if 1<2<…

使用VS2019創建項目,添加文件和庫地址

1&#xff0c;創建項目的類型很重要&#xff0c;fisherman服務器密碼機使用C語言進行開發&#xff0c;只可以使用控制臺應用 將需要的頭文件拷貝到新建的工程里面 然后&#xff0c;打開解決方案資源管理器&#xff0c;點擊添加&#xff0c;添加現有項&#xff0c;選中拷貝的頭…

java -web html5學習1

基礎標簽 <!--html5聲明--> <!DOCTYPE html> <!--html標簽--> <html lang"en"> <!--文檔頭--> <head> <!--告知瀏覽器此頁面屬于什么字符編碼格式,--><meta charset"UTF-8"> <!-- 用于標識當前網頁的…

中科大 計算機網絡2 什么是互聯網

概論 互聯網 1&#xff09;網絡–包括節點和邊&#xff0c;與大小無關&#xff0c;如蜘蛛網&#xff0c;大腦神經元。。 下圖的網絡是一樣的 2&#xff09;計算機網絡 聯網的計算機所構成的系統 包括主機節點&#xff08;筆記本&#xff0c;ipad,手機&#xff0c;聯網的冰箱等…

虛擬機下Ubuntu配置IP地址和網段

服務器密碼機的地址是172.27.120.99 ubuntu系統的IP地址是192.168.133.138&#xff0c;使用net方式和主機共享網絡。現需要修改ip地址 第一步&#xff0c;net方式是不對的&#xff0c;需要選擇橋接方式&#xff0c;復制物理連接狀態 然后修改主機的物理連接&#xff0c;選擇搜…

漁翁服務器密碼機的環境配置

Linux版本 需要將配置文件 FMDevice.conf 存儲到 /etc目錄下需要將庫文件 libfmapiv100.so 存儲到 /lib64目錄下編譯的命令 gcc main.c ./libfmapiv100.so -lpthread -o test 需要指定 ./libfmapiv100.so&#xff0c;如果需要別的庫也需要進行指定&#xff0c;比如…

王道考研 計算機網絡1 計算機網絡概念,組成,功能和分類

計算機網絡概念&#xff0c;組成&#xff0c;功能和分類 怎樣學習計算機網絡 計算機網絡概念 1&#xff09;網絡和計算機網絡區別 網絡包含計算機網絡&#xff08;是通信技術和計算機技術相結合的產物&#xff09; 2&#xff09;計算機網絡的概念 分散的&#xff1a;指地理位…

ubuntu 修改旋轉屏幕顯示方向 恢復正常模式

參考鏈接 https://blog.csdn.net/YYshuangshuang/article/details/90576997 使用命令如下 xrandr -o normal 回到正常角度

王道考研 計算機網絡2 標準化工作

標準化工作 要實現不同廠商的硬軟件之間相互連通&#xff0c;必須遵從統一的標準 標準的分類&#xff1a; 法定標準&#xff1a;國內外 RFC請求評論 RFC請求評論–因特網標準 是一個因特網標準就一定是RFC形式&#xff0c;但不是所有的RFC都是因特網標準 之前的階段&#…

二叉搜索樹判定

leetcode的原文鏈接樹的定義C版本 需要給每一個節點的數值劃分范圍若任意節點的左子樹不空&#xff0c;則左子樹上所有結點的值均小于它的根結點的值&#xff1b;任意節點的右子樹不空&#xff0c;則右子樹上所有結點的值均大于它的根結點的值&#xff1b;任意節點的左、右子樹…

王道考研 計算機網絡3 速率相關的性能指標

速率 指快慢 比特&#xff1a;1/0&#xff08;1位比特&#xff09; 速率&#xff1a;單位換算1000倍&#xff08;小寫b&#xff09;&#xff0c;如&#xff0c;b/s比特每秒&#xff1b;kb/s千比特每秒 存儲容量&#xff1a;單位換算1024倍(大寫B)&#xff0c;如B字節&#xf…

C++ limits頭文件的用法numeric_limits

參考鏈接 Cplus plus參考鏈接numeric_limits<double>::max ()是函數&#xff0c;返回編譯器允許的 double 型數 最大值。類似的 numeric_limits<int>::max () 返回 編譯器允許的 int 型數 最大值。需包含頭文件 #include <limits> imits是STL提供的頭文件&…

Linux系統運維1 運維 項目研發 網站 服務器 計算機基礎 Linux操作系統

運維的基本概念 運維行業前景 企業運作模式 四大部門 項目研發流程 職責描述&#xff1a; 運維的作用&#xff1a; 網站的相關概念 網站運行流程&#xff1a; IP<–>域名 重要概念&#xff1a; 服務器圖片&#xff1a; 服務器&#xff1a;為用戶提供服務的機器&…

Linux 時間函數的使用

頭文件 #include <chrono> #include <functional>namespace hsm { namespace common {class Timer { public:Timer();void reset();long peek_us() const;long peek_ms() const;double peek_msf() const;double record_msf(const std::function<void()> &am…

王道考研 計算機網絡4 速率相關的性能指標

時延 發送時延; 發送時延;10bit 除以10b/s1s 傳播時延&#xff1a; 100 m除以10m/s10s 當信道寬帶提高&#xff08;發送速率&#xff09;&#xff0c;發送時延減少&#xff0c;但并不會提高傳播時延–高速鏈路情況 總&#xff1a; 時延帶寬積 描述數據量&#xff0c;鏈路…

std::chrono::duration_cast時間計算

參考鏈接 std::chrono::duration_cast