LeetCode: 給定一個整數陣列,判斷是否存在重複元素
阿新 • • 發佈:2020-12-14
每天一道LeetCode Day1
題目:給定一個整數陣列,判斷是否存在重複元素。
如果任意一值在陣列中出現至少兩次,函式返回 true 。如果陣列中每個元素都不相同,則返回 false 。
- 暴力法
思路::遍歷當前的陣列,使得每一個元素num[i](i<len) 與後面的所有的元素num[j](i<j<len) 進行比較,只要相等,返回True。
public boolean containsDuplicate(int[] nums) {
int len=nums.length;
for (int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(nums[i]==nums[j]){
return true;
}
}
}
return false;
}
提交之後,提示超時。
- 利用Map
思路: 遍歷陣列,利用Map對鍵值的不可重複性,在每次加入的時候,判斷是否存在當前元素的鍵值,若有,則返回True,否則繼續新增。
public boolean containsDuplicateMap(int[] nums) {
int len=nums.length;
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<len;i++){
if(map.containsKey(nums[i])){
return true;
}else{
map.put(nums[i],i);
}
}
return false;
}
結果:
不是很理想,進一步優化。
- 利用Set的天生不可重複性
思路: 遍歷陣列,將所有的元素加入之後,判斷最後的Set的大小是否與陣列的長度一致,如一致則返回false,否則返回True。
public boolean containsDuplicateSet(int[] nums) {
int len=nums.length;
Set<Integer> set=new HashSet<>();
for(int temp:nums){
set.add(temp);
}
return set.size()==len?false:true;
}
感覺還是有點慢,再想想…
- 先排序,再比較
思路: 先排序,再比較相鄰的元素看是否相等,如相等,則返回True。
public boolean containsDuplicateSort(int[] nums) {
Arrays.sort(nums);
for(int i=1;i<nums.length;i++){
if(nums[i-1]==nums[i]){
return true;
}
}
return false;
}
- 他山之石
public boolean containsDuplicate(int[] nums) {
return Arrays.stream(nums).distinct().count() < nums.length;
}
實際執行的時候,效率並不高,只是使用了新特性,這裡學習一下。