Jelajahi Sumber

添加回溯leetcode题目答案

zhuyijun 2 tahun lalu
induk
melakukan
691f54b150
3 mengubah file dengan 90 tambahan dan 7 penghapusan
  1. 12 5
      fbl.cpp
  2. 76 0
      recall/46.cpp
  3. 2 2
      recall/51.cpp

+ 12 - 5
fbl.cpp

@@ -3,11 +3,16 @@
  * @Version: 1.0
  * @Autor: zhuyijun
  * @Date: 2021-11-10 21:56:48
- * @LastEditTime: 2021-11-10 22:22:02
+ * @LastEditTime: 2021-11-11 12:29:39
  */
 #include <bits/stdc++.h>
 using namespace std;
 
+int fbl1(int n) {
+  if (n == 1 || n == 2) return 1;
+  return fbl1(n - 1) + fbl1(n - 2);
+}
+
 int helper(vector<int> list, int n) {
   if (n == 1 || n == 2) {
     return 1;
@@ -39,15 +44,17 @@ int fbl_dp2(int n) {
   }
   int prev = 1, curr = 1;
   for (int i = 3; i <= n; i++) {
-    int sum = prev + curr;
+    int sum = prev + curr;g
     prev = curr;
     curr = sum;
   }
   return curr;
 }
 int main() {
-  std::cout << fbl(20) << std::endl;
-  std::cout << fbl_dp(20) << std::endl;
-  std::cout << fbl_dp2(20) << std::endl;
+  std::cout << fbl(5) << std::endl;
+  std::cout << fbl1(5) << std::endl;
+  std::cout << fbl_dp(5) << std::endl;
+  std::cout << fbl_dp2(5) << std::endl;
+
   return 0;
 }

+ 76 - 0
recall/46.cpp

@@ -0,0 +1,76 @@
+/*
+ * @Description:
+ * @Version: 1.0
+ * @Autor: zhuyijun
+ * @Date: 2021-11-11 21:30:12
+ * @LastEditTime: 2021-11-11 22:06:51
+ */
+//全排列   回溯问题
+/*
+给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序
+返回答案。
+示例 1:
+
+输入:nums = [1,2,3]
+输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
+示例 2:
+
+输入:nums = [0,1]
+输出:[[0,1],[1,0]]
+示例 3:
+
+输入:nums = [1]
+输出:[[1]]
+ */
+#include <bits/stdc++.h>
+using namespace std;
+//全部路径 路径全排列
+vector<vector<int>> res;
+/**
+ * @brief
+ *
+ * @param nums  选择列表
+ * @param list 路径记录在其中
+ * 结束条件: nums中的元素全在list中
+ */
+void backtrack(vector<int>& nums, vector<int>& list) {
+  // 结束条件
+  if (list.size() == nums.size()) {
+    res.push_back(list);
+  }
+  for (int num : nums) {
+    //排除不合法的选择
+    auto result = find(list.begin(), list.end(), num);
+    if (result != list.end()) {
+      continue;
+    }
+    //添做选择
+    list.push_back(num);
+    //进入下一层决策树
+    backtrack(nums, list);
+    result = remove(list.begin(), list.end(), num);
+    //取消选择
+    list.erase(result);
+  }
+}
+vector<vector<int>> permute(vector<int>& nums) {
+  vector<int> list;
+  backtrack(nums, list);
+  return res;
+}
+
+//测试
+int main() {
+  vector<int> nums;
+  nums.push_back(1);
+  nums.push_back(2);
+  nums.push_back(3);
+  auto res = permute(nums);
+  for (auto result : res) {
+    for (auto r : result) {
+      cout << r << " ";
+    }
+    cout << endl;
+  }
+  return 0;
+}

+ 2 - 2
recall/51.cpp

@@ -3,7 +3,7 @@
  * @Version: 1.0
  * @Autor: zhuyijun
  * @Date: 2021-11-11 22:23:35
- * @LastEditTime: 2021-11-11 23:02:49
+ * @LastEditTime: 2021-11-11 23:05:48
  */
 #include <bits/stdc++.h>
 using namespace std;
@@ -11,7 +11,7 @@ vector<vector<string>> res;
 bool isVaild(vector<string> &board, int row, int col) {
   int n = board.size();
   // 检查列
-  for (int i = 0; i < row; i++) {  // 这是一个剪枝
+  for (int i = 0; i < row; i++) {
     if (board[i][col] == 'Q') {
       return false;
     }