Given an integer array nums
, return the length of the largest strictly increaing subsequence.
1 <= nums.length <= 2500
$-10^4$ <= nums[i] <= $10^4$
Input | Output |
---|---|
nums = [10,9,2,5,3,7,101,18] | 4 |
Explanation : The longest increasing subsequence is [2,3,7,101], therefore the length is 4.
Input | Output |
---|---|
nums = [0,1,0,3,2,3] | 4 |
Input | Output |
---|---|
nums = [7,7,7,7,7,7,7] | 1 |
์ด ๋ฌธ์ ๋ ์์ ํ์์ผ๋ก๋ ํ ์ ์์ง๋ง,
Dynamic Programming
๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ ํจ์จ์ ์ด๋ค.
Dynamic Programming
๊ธฐ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ฃผ์ด์ง nums
์ ๊ธธ์ด๋งํผ์ dp
๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค.
์ด ๋ฌธ์ ์์ dp
๋ฐฐ์ด์ ์ญํ ์ i
๋ฒ์งธ ์ซ์๊ฐ ๋ง์ง๋ง ๋ฐฐ์ด์ ์์์ผ ๋, ๊ทธ ๋ฐฐ์ด์์ ๊ฐ์ฅ ๊ธด ์ค๋ฆ์ฐจ์ ์์ด์ ๊ธธ์ด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด, ์ด์ ํ์์ ๊ฒฐ๊ณผ๋ฅผ ์ต๋ํ ํ์ฉํ ์๊ฐ ์๊ฒ ๋๋ค.
// dp ๋ฐฐ์ด ์์ฑ
int[] dp = new int[nums.length];
// dp ๋ฐฐ์ด ์ด๊ธฐํ
for (int i = 0; i < dp.length; i++) {
dp[i] = 1;
}
์ฃผ์ด์ง nums
๋ฐฐ์ด ๊ธธ์ด๋งํผ dp ๋ฐฐ์ด์ ์์ฑํด ์ฃผ๊ณ ,
๋ชจ๋ ์์๋ฅผ 1๋ก ์ด๊ธฐํ ํ๋ค.
for (int i = 1; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
ํ์ฌ ์์น i
์์ i
๋ณด๋ค ์ผ์ชฝ์ ์๋ ์์๋ค์ dp[i]
๊ฐ๋ค์ ํ์ธ ํ,
nums[j] < nums[i]
์ธ ๊ฒฝ์ฐ ์์๊ฐ๋ค์ ๋น๊ตํ๊ณ , dp
๋ฐฐ์ด์ ์
๋ฐ์ดํธ๋ฅผ ํด ์ค๋ค.
public static int lengthOfLIS(int[] nums) {
int answer = 1;
// dp ๋ฐฐ์ด ์์ฑ
int[] dp = new int[nums.length];
// dp ๋ฐฐ์ด ์ด๊ธฐํ
for (int i = 0; i < dp.length; i++) {
dp[i] = 1;
}
for (int i = 1; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
for (int i : dp) {
answer = Math.max(answer, i);
}
return answer;
}
์ด๋ ค์๋ ํฌ๊ธฐํ์ง ๋ง๊ณ ์์์์