定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k

题目:如下图;只要找到当前位置后的k个元素中有元素等于当前元素即可。
在这里插入图片描述

双层遍历解法

实现逻辑

双层遍历,每次遍历都将当前位置i的元素,于(i+1)到(i+k)元素进行比较如果相等,则返回true;

注意:i后元素遍历时,要保证不越界;

源码

 //当数组为空,或者数组无元素,指定间隔距离为0
 if(a==null||a.length==0||k==0){
     return false;
 }
 for(int i = 0;i<a.length;i++){
 	//遍历当前位置后K个元素
     for(int j=1;j<=k;j++){
     	//保证元素位置不越界,以及判断元素值相等
         if(i+j<a.length&&a[i]==a[i+j]){
             return true;
         }
     }
 }
 return false;

ArrayList解法

实现逻辑

只进行一层遍历,利用ArrayList存储元素,每次只存储K个元素,使用contains()方法校验在ArrayList是否有这个元素,有则返回true;当元素数量超过K个时,移除第一个元素,保证只在K的间隔里有重复元素。

源码

 //当数组为空,或者数组无元素,指定间隔距离为0
 if(a==null||a.length==0||k==0){
     return false;
 }
 List<Integer> arr = new ArrayList<>();
 for(int i = 0;i<a.length;i++){
     //校验List是否包含该元素
     if(arr.contains(a[i])){
         return true;
     }
     arr.add(a[i]);
     //保证List的长度不超过K
     if(arr.size()>k){
         arr.remove(0);
     }
 }
 return false;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值