iT邦幫忙

2025 iThome 鐵人賽

0
自我挑戰組

leetcode解題學習java系列 第 20

30天LeetCode挑戰紀錄-DAY20. Longest Increasing Subsequence

  • 分享至 

  • xImage
  •  

題目

https://ithelp.ithome.com.tw/upload/images/20251019/20178158nFdaDvkxuJ.png

他說他會給我們一個整數陣列,然後我們要找出最長的遞增長度,並回傳。

Example 1:
Input: nums = [10,9,2,5,3,7,101,18]
Output: 4
因為可以找到他的最長遞增子序列為[2,3,7,101],也可以是[2,5,7,18]......不只一組的遞增子序列,然後他們的長度剛好也都是一樣最長的。所以Output就是4。

想法

我讓這題的dp[i]代表的就是每個位置可以往前沿出去找到最長遞增子序列的長度,就是這個遞增子序列是以第i個數字為結尾的,然後因為每個數字自己都能當這個子序列,所以dp初始值=1,然後我想到的是用兩個for迴圈來做判斷,外層做的事情是跑現在要算的數;內層的是在i前面的所有元素。如果 nums[j] < nums[i],就代表我可以接在j後面,所以可以更新max()來比較dp[i]和dp[j] + 1誰大,這樣一直跑跑跑到最後就是我們要找的「最長遞增子序列長度」了!

程式碼

class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        Arrays.fill(dp, 1); // 每個元素可以自己當一個子序列

        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i]) { // 判斷可不可以接
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }

        int ans = 0;
        for (int i = 0; i < dp.length; i++) {
        ans = Math.max(ans, dp[i]);   //找dp[]裡最大的那個數
        }
        return ans;
    }
}

執行成功!
https://ithelp.ithome.com.tw/upload/images/20251019/201781581zoMR9evb2.png

剩十篇了。。。


上一篇
30天LeetCode挑戰紀錄-DAY19. Coin Change
下一篇
30天LeetCode挑戰紀錄-DAY21. Unique Paths
系列文
leetcode解題學習java30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言