一、題目名稱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