leetcode--Contains Duplicate II

来源:互联网 发布:mac os 10.12 beta5 编辑:程序博客网 时间:2024/05/22 13:31

题目:Contains Duplicate II

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.

题目分析:若数组中存在两个元素相等且index值的差小于等于k返回true,否则返回false。

One:运用HashMap的方法

public class Solution {    public boolean containsNearbyDuplicate(int[] nums, int k) {        if(nums==null||nums.length==0)return false;                Map<Integer,Integer> map = new HashMap<Integer,Integer>();                for(int i = 0;i < nums.length;i++){            if(map.containsKey(nums[i])){               if(i-map.get(nums[i])<=k){                   return true;               }else{                   map.remove(nums[i]);                   map.put(nums[i],i);               }            }            map.put(nums[i],i);        }        return false;    }}
Two:了解了HashMap的put方法若键值已存在返回旧键值的value,不存在加入map,且返回null。进一步对代码进行优化如下:

public class Solution {    public boolean containsNearbyDuplicate(int[] nums, int k) {        Map<Integer,Integer> map = new HashMap<Integer,Integer>();                for(int i = 0;i < nums.length;i++){            Integer oldv = map.put(nums[i],i);            if(oldv!=null&&i - oldv <= k){                return true;            }        }        return false;    }}

Three:用HashSet的方法,及时保持HashSet的长度小于等于k

public class Solution {    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;    }}
Four:对比两条语句放在前和后的区别

public boolean containsNearbyDuplicate(int[] nums, int k) {    HashSet<Integer> hs=new HashSet<>();    for(int i=0;i<nums.length;i++)    {        if(hs.add(nums[i])==false) return true;        if(hs.size()==k+1) hs.remove(nums[i-k]);    }    return false;}





0 0
原创粉丝点击