在乙個長度為n的陣列裡的所有數字都在0~n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列 那麼對應的輸出是重複的數字2或3。
時間複雜度o(n),空間複雜度o(n), 額外空間用於構建雜湊表
思想:建立乙個雜湊表,然後對當前陣列中元素遍歷,若當前所遍歷的元素不在雜湊表中,則放入,若存在即為重複數字。
對應關係【當前元素值 —>雜湊表的索引】。例: 當前遍歷位數字2, 如果hash[2]=true。表示已經2存在雜湊表中。
**如下:
# include
# include
# include
using namespace std;
bool duplicate
(int numbers,
int length,
int* duplication)
else
}return false;
}int
main()
;int
*duplication = new int(0
);int length =
sizeof
(numbers)
/sizeof
(numbers[0]
);duplicate
(numbers,length, duplication)
; cout<<
*duplication
}
時間複雜度o(n),空間複雜度o(1) 在輸入上進行操作,不額外分配空間
陣列中的數字都在0~ n-1的範圍內,如果沒有重複的話,那麼當陣列排序之後,數字i 將出現在下標為i 的位置上,如果陣列中有重複,那麼有些位置可能存在多個數字,利用這點來進行操作。
首先,重排這個陣列,從頭到尾進行掃瞄,當在第i 位時,我們先判斷這個數字(m)是不是等於i,如果是,那麼掃瞄下乙個數字,如果不是,則拿他和第m個數字進行比較,如果他和第m個數字相等,則找到了乙個重複數字(因為同時出現在第i,m位置),如果他和第m個數字不相等,就把他們交換。
# include
# include
# include
using namespace std;
bool duplicate
(int numbers,
int length,
int* duplication)
int temp = numbers[i]
; numbers[i]
= numbers[temp]
; numbers[temp]
= temp;}}
return false;
}int
main()
;int
*duplication = new int(0
);int length =
sizeof
(numbers)
/sizeof
(numbers[0]
);duplicate
(numbers,length, duplication)
; cout<<
*duplication
}
在乙個長度為n+1的陣列裡的所有數字都在1~n的範圍內,所以陣列中是少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如輸入長度為8的陣列 那麼輸出的重複數字是2或者3.
題目二看起來和題目一非常相似,但是不同的是,題目二中
明確規定不能修改輸入陣列,所以上面提到的交換法就不能再用。
和上面的雜湊表類似,只要逐一的複製原陣列的每個數字複製到輔助陣列(如果被複製的數字是m,則把它複製到輔助陣列中下表為m的位置),這樣就很容易的發現那個數字是重複的。但是該方法需要o(n)的輔助空間。
主要思想:
把1~n的數字 從中間的數字m分為兩部分,前面那一半為1~m, 後面一半為m+1~n。如果前一半(1-m)的數字總數超過了 m,那麼這一半的區間裡一定包含了重複的數字,否則,重複數字就在另一半的區間中。然後我們繼續對包含重複數字的區間一分為二,直到找到這個重複數字,其實這個方法和二分查詢類似,只是多了一步統計區間內數字個數。
# include
# include
# include
using namespace std;
intgetduplication
(const
int*numbers,
int length)}if
(lowcnt >
(mid - start +1)
)else
}return start;
}int
main()
;int length =
sizeof
(numbers)
/sizeof
(numbers[0]
);int duplication =
getduplication
(numbers,length)
; cout<<
"the duplication is : "
}
劍指offer 面試題3
思路 從左下角或者右上角開始比較 簡單版本 查詢方式從右上角開始查詢 如果當前元素大於target,左移一位繼續查詢 如果當前元素小於target,下移一位繼續查詢 進行了簡單的修改,可以判定輸入型別為字元的情況 查詢方式從左下角開始查詢 如果當前元素大於target,上移一位繼續查詢 如果當前元素...
劍指offer面試題3
前言 從最近的比賽中,真的可以看出來自己做題目太少了,一些常見的演算法,思路都不怎麼會,接下來要好好努力了 分析 書中給的分析思路很好,要解決乙個複雜的問題,最有效的方法就是從乙個具體的問題入手,這道題就可以舉例子,查詢7這個元素,首先從右上角開始,9比7大,所以9所在的列不會有,查詢8,比7大,所...
《劍指offer》陣列相關面試題
在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...