日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

[Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]

發(fā)布時間:2023/12/10 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【問題描述】[中等]

給兩個整數(shù)數(shù)組 A 和 B ,返回兩個數(shù)組中公共的、長度最長的子數(shù)組的長度。示例 1:輸入: A: [1,2,3,2,1] B: [3,2,1,4,7] 輸出: 3 解釋: 長度最長的公共子數(shù)組是 [3, 2, 1]。 說明:1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100

【解答思路】

1. 暴力法

時間復(fù)雜度:O(N^3) 空間復(fù)雜度:O(1)

public int findLength1(int[] numa, int[] numb) {if(numa == null || numb ==null){return 0;}int max = 0;int aLen = numa.length, bLen = numb.length;int aIndex, bIndex, sameLen;for(int i=0; i<aLen; i++){for(int j=0; j<bLen; j++){aIndex = i;bIndex = j;sameLen = 0;while(aIndex<aLen && bIndex<bLen && numa[aIndex]==numb[bIndex] ){sameLen++;aIndex++;bIndex++;}if(max < sameLen){max = sameLen;}}}return max;}
2. 動態(tài)規(guī)劃


第 1 步:設(shè)計狀態(tài)
int[][] dp 表示 A[i:] 和 B[j:] 的最長公共前綴
第 2 步:狀態(tài)轉(zhuǎn)移方程
如果 A[i] == B[j],那么 dp[i][j] = dp[i + 1][j + 1] + 1,否則 dp[i][j] = 0。
第 3 步:考慮初始化
int[][] dp = new int[n + 1][m + 1];
第 4 步:考慮輸出 max
第 5 步:考慮是否可以狀態(tài)壓縮 暫時不考慮

時間復(fù)雜度:O(N×M) 空間復(fù)雜度:O(N×M)

class Solution {public int findLength(int[] A, int[] B) {int n = A.length, m = B.length;int[][] dp = new int[n + 1][m + 1];int ans = 0;for (int i = n - 1; i >= 0; i--) {for (int j = m - 1; j >= 0; j--) {dp[i][j] = A[i] == B[j] ? dp[i + 1][j + 1] + 1 : 0;ans = Math.max(ans, dp[i][j]);}}return ans;} } public int findLength(int[] A, int[] B) {int lenA = A.length;int lenB = B.length;int[][] dp = new int[lenA][lenB];int max = Integer.MIN_VALUE;for (int i = 0; i < lenA; i++) {for (int j = 0; j < lenB; j++) {if (A[i] == B[j]){if (i > 0 && j > 0){dp[i][j] = dp[i - 1][j - 1] + 1;}else{dp[i][j] = 1;}}max = Math.max(max,dp[i][j]);}}return max;}
3. 滑動窗口


時間復(fù)雜度:O((N+M)×min(N,M)) 空間復(fù)雜度:O(1)

class Solution {public int findLength(int[] A, int[] B) {int n = A.length, m = B.length;int ret = 0;for (int i = 0; i < n; i++) {int len = Math.min(m, n - i);int maxlen = maxLength(A, B, i, 0, len);ret = Math.max(ret, maxlen);}for (int i = 0; i < m; i++) {int len = Math.min(n, m - i);int maxlen = maxLength(A, B, 0, i, len);ret = Math.max(ret, maxlen);}return ret;}public int maxLength(int[] A, int[] B, int addA, int addB, int len) {int ret = 0, k = 0;for (int i = 0; i < len; i++) {if (A[addA + i] == B[addB + i]) {k++;} else {k = 0;}ret = Math.max(ret, k);}return ret;} }

【總結(jié)】

1. 暴力法 注意邊界問題
2.動態(tài)規(guī)劃 做到前四就不錯啦

第 1 步:設(shè)計狀態(tài)
第 2 步:狀態(tài)轉(zhuǎn)移方程
第 3 步:考慮初始化
第 4 步:考慮輸出
第 5 步:考慮是否可以狀態(tài)壓縮

3.滑動窗口 還可以是兩個塊之間對比使用 之前都是用雙指針滑的

轉(zhuǎn)載鏈接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/solution/zui-chang-zhong-fu-zi-shu-zu-by-leetcode-solution/

總結(jié)

以上是生活随笔為你收集整理的[Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。