劍指offer 面試題3 陣列中重複的數字

2021-10-06 01:15:57 字數 1334 閱讀 2192

目錄

0、題目描述

0.1、樸素想法--排序or桶排

0.2、劍指offer解法理解

1、高階題目描述

1.1、樸素想法--桶排or使用stl

2.2、劍指offer解法理解

①很容易想到的是先排序,然後判斷相鄰兩個數字之間是否相等。如果相等直接返回true即可。

此時好處是空間複雜度是o1,時間複雜度取決於排序的時間複雜度。

(發散一下複習高階排序演算法:堆排序、快速排序)

②可以通過桶排,缺點是空間換時間。

這裡想寫一下自己較為通俗的去理解劍指offer中的解法。

多讀幾遍題目找一找隱含條件,長度為n且數字必須在0~n-1之間。

逆向的去想一下就可以發現不重複的情況只有一種即:0~n-1的數字都存在且只有一次。

根據這種唯一性可以這樣去理解:n個人,n個座位。都有自己的編號,編號對應乙個唯一屬於自己的座位。

根據書中的例子,有7個座位,編號{0、1、2、3、4、5、6}

當前0號位置上坐的是2;

一號位置上坐的是3;

…從左向右遍歷這個座位,我們可以根據座位號和號碼是否相同來區分這個"人"是否"失位"?

0號位置上坐的是2,則2稱為失位,我們需要把2送回到2號位上。

當然,如果2號位已經坐了2那麼可以直接退出說明2重複了。

換完之後,繼續判斷0號位是否依然失位。

高階題目增加不允許修改原陣列為條件。且數字範圍1~n之間,不再是0~n-1。

與上述相同。桶排空間換時間。

在資料量比較大的時候,用stl中set或者map可以以較小的空間代價完成任務。

在這個例子中,數字範圍在1~8之間,那麼如果有重複的數字必須也是在1~7之間。

思路是通過二分法將區間不斷分割。

比如說,第一次分割區間是1~4和5~8兩個區間

遍歷一次整個陣列,如果小於等於4就count++,那麼一趟之後我們就可以知道1~4區間中有多少個數字,反之用8(陣列的總長度)減去這個count就可知5~8之間有多少個數字。

如果count正好等於區間長度或者count大於區間長度,那麼這個重複數字可能或者一定在這個區間。

繼續對這個區間二分。。以此推類。

但很明顯,這個演算法的弊端是只能找出乙個重複數字。

如果有兩個重複數字,那麼一定會在某個分割階段,兩個區間會割離。

比如{4,4,4,4,8,8,8,8}那麼在第一次分割區間的時候只能選擇1~4的區間,或者5~8的區間。

而無論你的演算法選擇哪個區間你都會失去一種情況。

劍指offer 面試題3

思路 從左下角或者右上角開始比較 簡單版本 查詢方式從右上角開始查詢 如果當前元素大於target,左移一位繼續查詢 如果當前元素小於target,下移一位繼續查詢 進行了簡單的修改,可以判定輸入型別為字元的情況 查詢方式從左下角開始查詢 如果當前元素大於target,上移一位繼續查詢 如果當前元素...

劍指offer面試題3

前言 從最近的比賽中,真的可以看出來自己做題目太少了,一些常見的演算法,思路都不怎麼會,接下來要好好努力了 分析 書中給的分析思路很好,要解決乙個複雜的問題,最有效的方法就是從乙個具體的問題入手,這道題就可以舉例子,查詢7這個元素,首先從右上角開始,9比7大,所以9所在的列不會有,查詢8,比7大,所...

《劍指offer》陣列相關面試題

在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...