[アルゴリズム]Repeated SubarayのLeetCode-Maximum Length
LeetCode - Maximum Length of Repeated Subarray
問題の説明
Example 1:
Input: nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
Output: 3
Explanation: The repeated subarray with maximum length is [3,2,1].
Example 2:
Input: nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
Output: 5
せいげんじょうけん
1. Brute Forceデュアルfor文は、同じ要素が見つかった場合、異なる要素が見つかるまでインデックスを追加します.これに対して、 O(n^3)
ダブルfor文、値が同じ場合はdp配列に保存
2つの配列の前のインデックスビットの値を重ねて保存
問題の説明
Given two integer arrays nums1 and nums2, return the maximum length of a subarray that appears in both arrays.
I/O例Example 1:
Input: nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
Output: 3
Explanation: The repeated subarray with maximum length is [3,2,1].
Example 2:
Input: nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
Output: 5
せいげんじょうけん
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 100
Solution1. Brute Force
import java.util.*;
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int maxSubLength = 0;
boolean[][] dp = new boolean[nums1.length][nums2.length];
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
// while문을 순회하면서 i번째와 j번째를 체크한적 있는 것은 skip
if (dp[i][j]) {
continue;
}
int subCount = 0;
// 같은 원소를 찾은 경우
if (nums1[i] == nums2[j]) {
dp[i][j] = true;
int trasalNum1Idx = i + 1;
int trasalNum2Idx = j + 1;
subCount = 1;
// trasalNum1Idx와 trasalNum2Idx가 가리키는 원소가 다를때까지 while문을 순회하며 동일 subarray 길이 구함
while (trasalNum1Idx < nums1.length && trasalNum2Idx < nums2.length
&& nums1[trasalNum1Idx] == nums2[trasalNum2Idx]) {
dp[trasalNum1Idx][trasalNum2Idx] = true;
subCount++;
trasalNum1Idx++;
trasalNum2Idx++;
}
maxSubLength = Math.max(maxSubLength, subCount);
}
}
}
return maxSubLength;
}
2. DPダブルfor文、値が同じ場合はdp配列に保存
2つの配列の前のインデックスビットの値を重ねて保存
public int findLengthWithDP(int[] nums1, int[] nums2) {
int maxSubLength = 0;
int[][] dp = new int[nums1.length][nums2.length];
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
if (nums1[i] == nums2[j]) {
dp[i][j] = i>0 && j > 0 ? dp[i-1][j - 1] + 1 : 1;
maxSubLength = Math.max(maxSubLength, dp[i][j]);
} else {
dp[i][j] = 0;
}
}
}
return maxSubLength;
}
Reference
この問題について([アルゴリズム]Repeated SubarayのLeetCode-Maximum Length), 我々は、より多くの情報をここで見つけました https://velog.io/@jerry92/알고리즘-LeetCode-Maximum-Length-of-Repeated-Subarrayテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol