leetcode 220. Contains Duplicate III(存在重复 III)

给定一个整数数组,判断数组中是否有两个不同的索引 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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值