問題:
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.
大意:
給出一個整型數組和一個整型數k,判斷數組中是否任何兩個不一樣的位置i和j,如果 nums[i] = nums[j] ,i和j的距離不大于k。
思路:
這道題看起來簡單,不過有很多陷阱,比如如果k = 0,那么無論數組如何都是錯的。如果數組中不存在一樣的兩個數,也是錯的。如果數組中存在多個一樣的同一個數,只要有最短的兩個的距離小于等于k就可以了等等,我把代碼縫縫補補后,還是在一個很長數組的測試用例下超時了。。。不過我用的是最直接的方法,看了看如果合理地使用一些數據結構,就會很方便,比如使用set,set集合的特性是里面不會出現兩個不一樣的數字,那么我們建立一個長度為k的set,用它來掃描整個數組,不斷地判斷新出現的數據能不能放進去,如果不能放進去,說明存在距離小于等于k的數據是有相等的,否則就可以放進去,當然set中的數據量如果超過k了就要同時把早先放進去的數據拿出來了,如果掃描過后都可以放進去和取出來,說明沒找到小于等于k的相等的數,那就錯了。
這道題有個地方不一樣在于,一般的題目都是碰到什么就返回false,都沒有false才返回true。而這道題卻是遇到什么則返回true,都沒有true,才返回false。
他山之石:
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> set = new HashSet<Integer>();
for(int i = 0; i < nums.length; i++){
if(i > k) set.remove(nums[i-k-1]);
if(!set.add(nums[i])) return true;
}
return false;
}
合集:https://github.com/Cloudox/LeetCode-Record