zoukankan      html  css  js  c++  java
  • Leetcode978 最长湍流子数组 DP

     

      动态规划,递归表示:

    public final int maxTurbulenceSize(int[] A) {
            Map<Long, Integer> cache = new HashMap<Long, Integer>();
            int an = 0;
            for (int i = 0; i < A.length; i++) {
                an = Math.max(an, search(A, i, true, cache));
                an = Math.max(an, search(A, i, false, cache));
            }
            return an;
        }
    
    
        private final int search(int[] arr, int point, boolean isUp, Map<Long, Integer> cache) {
            if (point == 0) return 1;
            int re = 1;
            Long key = (((long) point) << 32) | (isUp == false ? 0 : 1);
            if (cache.containsKey(key)) return cache.get(key);
            if ((arr[point - 1] - arr[point] < 0 && isUp) || (arr[point - 1] - arr[point] > 0 && !isUp)) {
                re = Math.max(re, search(arr, point - 1, !isUp, cache) + 1);
            }
            cache.put(key, re);
            return re;
        }

      递推表示:

    public final int maxTurbulenceSizeDP(int[] A) {
            int[] dp = {1, 1};
            int re = 1;
            for (int i = 1; i < A.length; i++) {
                int curr = A[i] - A[i - 1];
                if (curr > 0) {
                    dp[1] = dp[0] + 1;
                    re = Math.max(dp[1], re);
                    dp[0] = 1;
                } else if (curr < 0) {
                    dp[0] = dp[1] + 1;
                    re = Math.max(dp[0], re);
                    dp[1] = 1;
                } else {
                    dp[0] = 1;
                    dp[1] = 1;
                }
            }
            return re;
        }

    /**
     * @param {number[]} arr
     * @return {number}
     */
    var maxTurbulenceSize = function (arr) {
        let dp = [1, 1], re = 1, len = arr.length;
        if (!len || len == 0) return 0;
        for (let i = 1; i < len; i++) {
            let curr = arr[i] - arr[i - 1];
            if (curr > 0) {
                dp[1] = dp[0] + 1;
                re = Math.max(re, dp[1]);
                dp[0] = 1;
            } else if (curr < 0) {
                dp[0] = dp[1] + 1;
                re = Math.max(re, dp[0]);
                dp[1] = 1;
            } else {
                dp[0] = dp[1] = 1;
            }
        }
        return re;
    };

     

  • 相关阅读:
    ActiveMQ中JMS的可靠性机制
    ActiveMQ中Broker的应用与启动方式
    ActiveMQ支持的传输协议
    ActiveMQ常见消息类型
    Oracle体系结构及备份(十六)——bg-ckpt
    PHP自学之路---雇员管理系统(1)
    UVa11187
    给Android组件添加事件一个很好用的方法
    【项目那些事儿】项目哪些事儿?
    struts2对拦截器使用带实例
  • 原文地址:https://www.cnblogs.com/niuyourou/p/14148236.html
Copyright © 2011-2022 走看看