59. Contains Duplicate II

来源:互联网 发布:黑客帝国矩阵革命在线 编辑:程序博客网 时间:2024/04/30 01:21

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 jis at most k.

确理解题目的意思,数组中是否存在两个不同的i和j满足,nums[i] = nums[j]且,j-i不大于k。题目中要求的是存在即可。

/** * 正确理解题目的意思,数组中是否存在两个不同的i和j满足,nums[i] = nums[j]且,j-i不大于k。 * 所以,用集合s中至多包含k个元素。判断是否可以遇到两个nums[i] = nums[j]。 * 首先判断s中是否有nums[i],如果有则返回true,说明满足条件。 * 如果没有,则把nums[i]加入到s中,然后再判断s中元素个数,如果大于k则把存在在s中的数组中的第一个元素删掉。 */public boolean containsNearbyDuplicate2(int[] nums, int k) {int len = nums.length;int start = -1;/*表示目前在s中的数组中的第一个元素下标*/Set s = new HashSet<Integer>();for(int i = 0;i<len;i++){if(s.contains(nums[i])){return true;}else{s.add(nums[i]);if(s.size()>k){s.remove(nums[start]);start++;}}}return false;    }
第一次做的时候没有理解题目的意思,做错了。提交了很多次都没有通过,所以正确理解题目的意思很重要。

/** * 注意:我做的这个方法的基础是数组中nums[i]和nums[j]相等且i与j的差不大于k时返回true,否则返回false。 * 但是原题的意思是判断是否存在nums[i]和nums[j]相等且i与j的差不大于k,存在即返回true。重新又重新写了一个方法 * 布尔值flag作用是标注数组中是否有两个元素相等。 * 用hash表为辅助来做这个题目,首先hash表中关键字是nums[i],value存的是该关键字第一次出现的下标i。 * 如果h中包含nums[i],继续判断这次出现的下标与第一次出现的下标是否大于k,若是则返回false,否则什么也不做。 * 如果h中不包含nums[i]则把<nums[i],i>放到h中。 * 最后返回flag。 */public boolean containsNearbyDuplicate(int[] nums, int k) {int len = nums.length;boolean flag = false;/*作用是标注数组中是否有两个元素相等*/HashMap<Integer,Integer> h = new HashMap<Integer,Integer>();for(int i = 0;i<len;i++){if(h.containsKey(nums[i])){flag = true;if(i-h.get(nums[i])>k){return false;}}else{h.put(nums[i], i);}}return flag;    }



0 0