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

2021-10-04 11:32:18 字數 1057 閱讀 1356

題目描述:在乙個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。

解題方法1:用set容器,因為set容器的key值是不能重複的,將數字逐一新增進容器,若出現失敗,則該key值為重複元素。用到了乙個大小為n的容器set,所以時間空間複雜度均為o(n)。

class

solution

}return repeat;

}}

解題方法二:若不存在重複元素,對陣列排序後,陣列下標一定等於該元素本身。重排陣列:當掃瞄到下標為i的數字時,看這個數字m是否為i,如果是,掃瞄下乙個,如果不是,則將m與下標為m的數字比較,如果相等,則m為重複元素,如果不相等,則交換兩數,則排好了m這個元素,把它放在了m的位置上

class

solution

else}}

return-1

;}}

擴充套件題目:

不修改陣列找出重複數字,在一長度為n+1的陣列裡所有數字都在1~n範圍內,至少有乙個數字重複,在不排序的情況下,找出重複的數字。

方法:例如陣列長度為8,將陣列分為前一半為1~4 ,後一半為57,前一半的元素共出現了5次,所以重複的元素在14內,在二分法,得到重複的3~4內。最後start等於end等於3時候,發現3出現了兩次,所以找到3

public

static

intgetrepeatnum

(int numbers,

int length)

if(count>

(middle-start+1)

)else

}return-1

;}public

static

intcountrange

(int numbers,

int length,

int start,

int end)

}return count;

}

劍指offer 面試題3

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

劍指offer面試題3

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

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

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