題目描述:在乙個長度為 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時 首先...