iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
佛心分享-刷題不只是刷題

轉生理工組後從零開始的leetcode刷題系列 第 20

day-20[medium.491]nun-decreasing subsequences

  • 分享至 

  • xImage
  •  

Given an integer array nums, return all the different possible non-decreasing subsequences of the given array with at least two elements. You may return the answer in any order.


題目大意是有一個整數數列nums,我們要返回所有不同的「非遞減子序列」(不用按照順序但不能重複)。

我的解題思路:

  • 每個相鄰的兩個數字,右邊一定要>=左邊
  • 子序列不可以重複,且只少有兩個元素(nums[7,7,7]->[7,7]、[7,7,7])
  1. 不妙的是我有點看不懂leetcode自帶的第二行程式,等我預習一下再開始解題
    https://ithelp.ithome.com.tw/upload/images/20241004/201694326vzYBPfIzu.png
    不過因為不熟悉列表怎麼使用,我還是不知道程式怎麼開頭...
    所以最後求助了chatgpt!程式幾乎都照搬它寫的,我只是加了一些註釋方便我理解

  • 「List」:表示一個存儲Integer的列表

  • 「List<List>」:表示一個存儲 List 的列表

  • 回朔法:
    void backtrack(當前狀態, 結果集) {
    if (滿足條件) {
    保存當前結果;
    return;
    }
    for (所有可能的選擇) {
    做選擇;
    backtrack(新的狀態, 結果集); // 遞歸處理下一步
    撤銷選擇; // 回溯
    }
    }


class Solution {
    public List<List<Integer>> findSubsequences(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();  // 存儲結果
        List<Integer> tempList = new ArrayList<>();      // 暫存子序列
        backtrack(nums, 0, tempList, result);            // 回溯函數
        return result;                                  
    }

    // 回溯法:遇到不符合條件的選擇時撤回("回溯"),繼續嘗試其他選擇
    private void backtrack(int[] nums, int start, List<Integer> tempList, List<List<Integer>> result) {
        if (tempList.size() >= 2) { 
            result.add(new ArrayList<>(tempList));  // 複製tempList,然後加入結果
        }
        
        for (int i = start; i < nums.length; i++) { 
            // 遍歷子函數是否遞減
            if (tempList.isEmpty() || nums[i] >= tempList.get(tempList.size() - 1)) {
                // 確保同一層中不會重複數字
                if (i > start && nums[i] == nums[i - 1]) {
                    continue;  // 如果數字跟上一個相同就跳過
                }
                tempList.add(nums[i]);                    // 添加當前元素
                backtrack(nums, i + 1, tempList, result); // 處理下一個元素
                tempList.remove(tempList.size() - 1);     // 回溯,移除最後一個元素
            }
        }
    }
}


雖然是成功了,但因為沒有實際練習到寫程式,所以有一點空虛...
不過還是多少有學到新東西,我是這樣想來安慰自己的。https://ithelp.ithome.com.tw/upload/images/20241005/2016943264SOzXa1TD.png


上一篇
day-19[medium.397]integer replacement
下一篇
day-21[medium.2348]number of zero
系列文
轉生理工組後從零開始的leetcode刷題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言