题目描述:
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-ii
暴力破解:
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
for (int i = 0; i < nums.length; i++) {
for (int j = 1; j <= k; j++) {
if(i+j<nums.length && nums[i] == nums[i+j]) return true;
}
}
return false;
}
}
ArrayList解法:
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
ArrayList<Integer> arr = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if(arr.contains(nums[i])) return true;
arr.add(nums[i]);
if(arr.size()>k) arr.remove(0);
}
return false;
}
}
散列表解法
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; ++i) {
if (set.contains(nums[i])) return true;
set.add(nums[i]);
if (set.size() > k) {
set.remove(nums[i - k]);
}
}
return false;
}
}
ps:
在后两个方法中,可以看出ArrayList和散列表解法基本一致,而在实际运行过程中,前者耗费的时间远远超过了散列表。这是由于ArrayList在调用remove方法时,使用了System的arraycopy方法,需要不断的将数组内的元素复制到新数组中,比较耗费时间。