给定一个数组,以及一个整数k,判断数组中,是否存在相同的2个数,且这两个数的距离不超过k。
Input: nums = [1,2,3,1], k = 3
Output: true
Input: nums = [1,2,3,1,2,3], k = 2
Output: false
思路:
一:暴力搜索,提交OJ,显示运行超时。
bool containsNearbyDuplicate(vector<int>& nums, int k) { for (int i = 0; i < nums.size(); i++) { for (int j = 1; j <= k && (i+j) < nums.size(); j++) { if (nums[i] == nums[i + j]) return true; } } return false; }
二、运用哈希字典保存数组中的元素,key = nums[ i] , value = i. 当哈希字典中存在元素时,用现在的i-nums[i]得到两个下标的差,判断其是否小于等于k,提交OJ,能AC。
bool containsNearbyDuplicate(vector<int>& nums, int k) { unordered_map<int, int> map; for (int i = 0; i < nums.size(); i++) { if (map.count(nums[i]) && i - map[nums[i]] <= k) return true; map[nums[i]] = i; } return false; }
Java 版:
class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { int n = nums.length; if(n <= 1) return false; Map<Integer,Integer> map = new HashMap<>(); for(int i = 0; i < n; i++){ if(map.containsKey(nums[i])){ if(i - map.get(nums[i]) <= k) return true; else map.put(nums[i] , i); } else map.put(nums[i], i); } return false; } }