日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 646. Maximum Length of Pair Chain | 646. 最长数对链(暴力递归->傻缓存->dp)

發布時間:2024/2/28 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 646. Maximum Length of Pair Chain | 646. 最长数对链(暴力递归->傻缓存->dp) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

https://leetcode.com/problems/maximum-length-of-pair-chain/description/

題解

暴力遞歸->傻緩存->dp

寫完之后,看了答案發現,是我想復雜了。。

就當練了下 dp 吧。

class Solution {int n;int min, max;int offset;public int findLongestChain(int[][] pairs) {n = pairs.length;Arrays.sort(pairs, (o1, o2) -> {if (o1[0] < o2[0]) return -1;else if (o1[0] > o2[0]) return 1;else return o1[1] - o2[1];});// Approach 1: Recursive, Brute Force // return process1(pairs, 0, Integer.MIN_VALUE);// Approach 2: Recursion with Memoization // min = pairs[0][0]; // offset = -min + 1; // for (int[] p : pairs) { // max = Math.max(max, p[1]); // } // int[][] dp = new int[n + 1][max - min + 2]; // for (int[] a : dp) { // Arrays.fill(a, -1); // } // for (int j = 0; j < dp[0].length; j++) { // dp[n][j] = 0; // } // return process2(pairs, 0, min - 1, dp);// Approach 3: Dynamic Programmingmin = pairs[0][0];offset = -min + 1; // 將[min,max]映射到數組的[0, max-min+1]范圍for (int[] p : pairs) {max = Math.max(max, p[1]);}int[][] dp = new int[n + 1][max - min + 2];for (int[] a : dp) {Arrays.fill(a, -1);}for (int j = 0; j < dp[0].length; j++) {dp[n][j] = 0;}for (int i = n - 1; i >= 0; i--) {for (int j = 0; j < dp[0].length; j++) {int preEnd = j - offset;int p1 = pairs[i][0] > preEnd ? dp[i + 1][pairs[i][1] + offset] + 1 : 0;int p2 = dp[i + 1][j];dp[i][j] = Math.max(p1, p2);}}return dp[0][0];}// public int process1(int[][] pairs, int i, int val) { // 在可選位置為i的情況下,能獲得的最大長度 // if (i == n) return 0; // int p1 = pairs[i][0] > val ? process1(pairs, i + 1, pairs[i][1]) + 1 : 0; // 選當前元素 // int p2 = process1(pairs, i + 1, val); // 不選當前元素 // return Math.max(p1, p2); // } // // public int process2(int[][] pairs, int i, int preEnd, int[][] dp) { // int j = preEnd + offset; // if (dp[i][j] >= 0) return dp[i][j]; // // int p1 = pairs[i][0] > preEnd ? process2(pairs, i + 1, pairs[i][1], dp) + 1 : 0; // int p2 = process2(pairs, i + 1, preEnd, dp); // // dp[i][j] = Math.max(p1, p2); // return dp[i][j]; // } }

總結

以上是生活随笔為你收集整理的leetcode 646. Maximum Length of Pair Chain | 646. 最长数对链(暴力递归->傻缓存->dp)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。