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,我們要返回所有不同的「非遞減子序列」(不用按照順序但不能重複)。
我的解題思路:
「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); // 回溯,移除最後一個元素
}
}
}
}
雖然是成功了,但因為沒有實際練習到寫程式,所以有一點空虛...
不過還是多少有學到新東西,我是這樣想來安慰自己的。