给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使 nums [i] 和 nums [j] 的绝对差值最大为 t,并且 i 和 j 之间的绝对差值最大为 ķ。
这题简单的用双重循环,两两比较两个元素之间下标值<=k,且abs(nums [i]-nums [j] )<=t是会超时的,那么考虑减少无效判断.
首先考虑当j-i>k时,内层对于j的循环就可以break了,因为后面也不符合,但是这样做还是超时
那么考虑将数组按值得大小排序,然后双重循环,这时数组的下标值已经被打乱,因此需要自行定义一个结构存储下标值,此时内层循环的结束就是abs(list.get(i).val - list.get(j).val)>t,注意两个int做差值有可能超过int,因此转成long之后再做比较
class Ele{
int index;
int val;
public Ele(int i,int v){
index = i;
val = v;
}
}
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
List<Ele>list = new ArrayList<Ele>();
for(int i=0;i<nums.length;i++){
Ele ele = new Ele(i,nums[i]);
list.add(ele);
}
Collections.sort(list,new Comparator<Ele>() {
@Override
public int compare(Ele o1, Ele o2) {
long l = (long)o1.val - (long)o2.val;
if(l == 0){
return 0;
}
else if(l<0){
return -1;
}
return 1;
}
});
for(int i=0;i<list.size();i++){
for(int j=i+1;j<list.size();j++){
long l = (long)list.get(i).val - (long)list.get(j).val;
if(Math.abs(l) <= t){
if(Math.abs(list.get(i).index-list.get(j).index) <= k){
return true;
}
}
else{
break;
}
}
}
return false;
}