zoukankan      html  css  js  c++  java
  • arithmetic-slices-ii-subsequence(太难了)

    https://leetcode.com/problems/arithmetic-slices-ii-subsequence/

    太难了。。。

    package com.company;
    
    
    import java.util.*;
    
    // 终于找到原因了。还是我重复加了
    // 比如 46 46 47 48 49
    
    // 用累积记录过往节点记录,发现超时了
    // 参考了Discuss
    // https://discuss.leetcode.com/topic/66725/o-n-2-mle-tle-in-c-try-this-one-concise-and-fast
    
    // 其中 +1 这个地方 想了很久,终于想通了。意味着之前有一个长度为2的,会变成3.而为什么只加1就可以呢,因为用的是 last but one,
    // 倒数第二个,帮忙记录最后一个可能的结果,而倒数第二个和前一个的连接,总是一对一的。。
    
    // 实在太难了
    
    class Solution {
        public int numberOfArithmeticSlices(int[] A) {
            // Need use Long to avoid gap exceeding
            Map<Integer, Map<Long, Integer>> mp = new HashMap<>();
            Set<Long> cSet = new HashSet<>();
            for (int k: A) {
                cSet.add((long)k);
            }
    
            int ret = 0;
            Map<Long, Integer> lastMp;
            long gap;
            int tmp;
            int curRet;
    
            for (int i=0; i<A.length; i++) {
                Map<Long, Integer> tmpMp = new HashMap<>();
    
                for (int j=i-1; j>=0; j--) {
    
                    gap = (long)A[i] - (long)A[j];
    
                    if (tmpMp.containsKey(gap)) {
                        curRet = tmpMp.get(gap);
                    }
                    else {
                        curRet = 0;
                    }
    
                    lastMp = mp.get(j);
                    if (!lastMp.containsKey(gap)) {
                        tmp = 0;
                    }
                    else {
                        tmp = lastMp.get(gap);
                        ret += tmp;
                    }
    
                    //System.out.printf("val %d gap %d
    ", A[i], gap);
    
                    if (cSet.contains(A[i] + gap)) {
                        tmpMp.put(gap, curRet + tmp + 1);
                        //System.out.printf("here val %d gap %d
    ", A[i], gap);
                    }
                }
    
                mp.put(i, tmpMp);
            }
            return ret;
        }
    }
    
    public class Main {
    
        public static void main(String[] args) throws InterruptedException {
    
            System.out.println("Hello!");
            Solution solution = new Solution();
    
            // Your Codec object will be instantiated and called as such:
            int[] A = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
            int ret = solution.numberOfArithmeticSlices(A);
            System.out.printf("ret:%d
    ", ret);
    
            System.out.println();
    
        }
    
    }
  • 相关阅读:
    Fence Repair(POJ 3253)
    Saruman's Army(POJ 3069)
    Best Cow Line(POJ 3617)
    一往直前!贪心法
    最基础的“穷竭搜索”
    Lake Counting(POJ 2386)
    Ants(POJ 1852)
    热身题
    分布式锁的三种实现方式
    Redis在实际开发中面临的问题
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6039484.html
Copyright © 2011-2022 走看看