LeetCode:Contains Duplicate II - 判斷數組內是否有重複元素2

一、題目名稱java

Contains Duplicate II(判斷數組內是否有重複元素2)數組

二、題目地址函數

https://leetcode.com/problems/contains-duplicate-ii/.net

三、題目內容code

英文:Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the difference between i and j is at most k.blog

中文:給出一個整數數組,判斷該數組內是否有兩個元素值是相同的,且他們的索引值相差不大於k,是則返回true,不然返回false索引

四、一個TLE的方法leetcode

本題若是直接使用暴力方法解決會運行超時。一段TLE的Java代碼以下:開發

/**
 * @功能說明:LeetCode 219 - Contains Duplicate II
 * @開發人員:Tsybius2014
 * @開發時間:2015年10月15日
 */
public class Solution {
    
    /**
     * 查看數組內是否有重複元素且相鄰重複元素索引間隔不大於K
     * @param nums
     * @return
     */
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        
        if (nums.length <= 1) {
            return false;
        }

        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j <= i + k && j < nums.length; j++) {
                if (nums[i] == nums[j]) {
                    return true;
                }
            }
        }
        
        return false;
    }
}

五、解題方法1rem

一個比較容易想到的方式是使用HashMap來完成目標,使用HashMap解決本題的方式與解決第217題的方式(Contains Duplicate)很是相似。

Java代碼以下:

import java.util.HashMap;

/**
 * @功能說明:LeetCode 219 - Contains Duplicate II
 * @開發人員:Tsybius2014
 * @開發時間:2015年10月15日
 */
public class Solution {
    
    /**
     * 查看數組內是否有重複元素且相鄰重複元素索引間隔不大於K
     * @param nums
     * @return
     */
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        
        if (nums.length <= 1) {
            return false;
        }

        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        
        for (int i = 0; i < nums.length; i++) {
            if (hashMap.containsKey(nums[i]) && i - hashMap.get(nums[i]) <= k) {
                return true;
            }
            hashMap.put(nums[i], i);
        }
        
        return false;
    }
}

六、解題方法2

另外一種方式是使用HashSet來解決本問題。HashSet是使用HashMap實現的集合。在HashSet的add函數中,若是被插入的元素已存在,則返回true,不然返回false。下面的Java代碼就是利用了HashSet的這個性質:

import java.util.HashSet;

/**
 * @功能說明:LeetCode 219 - Contains Duplicate II
 * @開發人員:Tsybius2014
 * @開發時間:2015年10月15日
 */
public class Solution {

    /**
     * 查看數組內是否有重複元素且相鄰重複元素索引間隔不大於K
     * 
     * @param nums
     * @return
     */
    public boolean containsNearbyDuplicate(int[] nums, int k) {

        if (nums.length <= 1) {
            return false;
        }

        HashSet<Integer> hashSet = new HashSet<Integer>();
        for (int i = 0; i < nums.length; i++) {
            if (i > k) {
                hashSet.remove(nums[i - k - 1]);
            }
            if (!hashSet.add(nums[i])) {
                return true;
            }
        }

        return false;
    }
}

END

相關文章
相關標籤/搜索