1. 程式人生 > 其它 >LeetCode: 給定一個整數陣列,判斷是否存在重複元素

LeetCode: 給定一個整數陣列,判斷是否存在重複元素

技術標籤:letcode演算法資料結構leetcode

每天一道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;
    }

實際執行的時候,效率並不高,只是使用了新特性,這裡學習一下。