zoukankan      html  css  js  c++  java
  • 220. Contains Duplicate III

    原题链接:https://leetcode.com/problems/contains-duplicate-iii/description/
    这道题目不会做,别人的答案也没看懂。以后有钱了订阅会员看官方答案吧:

    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * Created by clearbug on 2018/2/26.
     */
    public class Solution {
    
        public static void main(String[] args) {
            Solution s = new Solution();
        }
    
        /**
         * 这道题目我思考了半天都没想出答案来,官方的答案又得订阅会员才能看到。。无奈之下看了下讨论区别人的答案,发现确实思路灰常不错,脑洞大开
         *
         * 妈的,刚开始以为自己看懂了呢。其实看懂了个屁。。这个方法:beats 91.94 %
         *
         * @param nums
         * @param k
         * @param t
         * @return
         */
        public boolean containsNearbyAlmostDuplicate1(int[] nums, int k, int t) {
            if (k < 1 || t < 0) {
                return false;
            }
    
            Map<Long, Long> map = new HashMap<>();
            for (int i = 0; i < nums.length; i++) {
                long remappedNum = (long) nums[i] - Integer.MIN_VALUE;
                long bucket = remappedNum / ((long) t + 1);
                if (map.containsKey(bucket)
                        || (map.containsKey(bucket - 1) && remappedNum - map.get(bucket - 1) <= t)
                        || (map.containsKey(bucket + 1) && map.get(bucket + 1) - remappedNum <= t)) {
                    return true;
                }
    
                if (map.entrySet().size() >= k) {
                    long lastBucket = ((long) nums[i - k] - Integer.MIN_VALUE) / ((long) t + 1);
                    map.remove(lastBucket);
                }
                map.put(bucket, remappedNum);
            }
    
            return false;
        }
    
        // 然后,我又看了下提交区效率最高的答案,马丹,就是最简单的暴力方法
        // 奶奶的,不知道为啥我提交这个答案就是超时了。。。不玩了
        public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
            if (k < 1 || t < 0 || nums.length <= 1) {
                return false;
            }
    
            for (int i = 0; i < nums.length - 1; i++) {
                for (int j = i + 1; j < nums.length && (j - i) <= k; j++) {
                    if (Math.abs((long) nums[j] - nums[i]) <= t) {
                        return true;
                    }
                }
            }
    
            return false;
        }
    }
    
  • 相关阅读:
    乱谈服务器编程
    set global slow_query_log引起的MySQL死锁
    一个由string使用不当产生的问题
    Hbase初体验
    浅谈SQLite——查询处理及优化
    ACID、Data Replication、CAP与BASE
    libevent源码分析
    浅析Linux Native AIO的实现
    vim7.2中文乱码解决方法
    伸展树的点点滴滴
  • 原文地址:https://www.cnblogs.com/optor/p/8629679.html
Copyright © 2011-2022 走看看