回溯法遵循深度优先吗_闲来刷下「回溯算法」
生活随笔
收集整理的這篇文章主要介紹了
回溯法遵循深度优先吗_闲来刷下「回溯算法」
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
定義
? 回溯算法實際上一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當(dāng)發(fā)現(xiàn)已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索,以達到目標(biāo)。但當(dāng)探索到某一步時,發(fā)現(xiàn)原先選擇并不優(yōu)或達不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個狀態(tài)的點稱為“回溯點”。許多復(fù)雜的,規(guī)模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。?
?
- 回溯算法的框架技巧
?
【46】全排列
思路
題解
//給定一個 沒有重復(fù) 數(shù)字的序列,返回其所有可能的全排列。 // // 示例: // // 輸入: [1,2,3] //輸出: //[ // [1,2,3], // [1,3,2], // [2,1,3], // [2,3,1], // [3,1,2], // [3,2,1] //] // Related Topics 回溯算法 //leetcode submit region begin(Prohibit modification and deletion) /*** @param {number[]} nums* @return {number[][]}*/ var permute = function (nums) {if (!nums || nums.length === 0) return [];if (nums.length <= 1) return [nums];// 路徑:記錄在 track 中var backtrack = function (nums, track = [], result) {// 結(jié)束條件:nums 中的元素全都在 track 中出現(xiàn)if (track.length === nums.length) {// 推入結(jié)果集,復(fù)制當(dāng)前數(shù)組并跳出result.push(track.slice(0));return;}for (var i = 0; i < nums.length; i++) {// 排除不合法的選擇if (track.includes(nums[i])) continue;track.push(nums[i]);// 進入下一層決策樹backtrack(nums, track);// 尾數(shù)出棧,繼續(xù)當(dāng)前遍歷track.pop();}};var result = [],track = [];backtrack(nums, track, result);return result; };復(fù)雜度分析
【47】全排列 II
思路
題解
//給定一個可包含重復(fù)數(shù)字的序列,返回所有不重復(fù)的全排列。 // // 示例: // // 輸入: [1,1,2] //輸出: //[ // [1,1,2], // [1,2,1], // [2,1,1] //] // Related Topics 回溯算法//leetcode submit region begin(Prohibit modification and deletion) /*** @param {number[]} nums* @return {number[][]}*/ var permuteUnique = function (nums) {if (!nums || nums.length === 0) return [];if (nums.length <= 1) return [nums];var result = [],track = [],used = {};// 排序是剪枝的必要操作// 為了判斷相鄰的重復(fù)數(shù)據(jù)是否達到剪枝條件nums.sort();var backtrack = function (nums, track, used, depth) {if (depth === nums.length) {// 符合規(guī)則的數(shù)組入棧result.push(track.slice(0));return;}for (var i = 0; i < nums.length; i++) {// 使用過則跳出if (used[i]) continue;// 剪枝 保證 nums[i - 1] 有意義if (i > 0 && nums[i] === nums[i - 1] && !used[i - 1]) continue;track.push(nums[i]);// 標(biāo)記索引 i 使用過used[i] = true;// 遞歸排列backtrack(nums, track, used, depth + 1);// 標(biāo)記使用完畢used[i] = false;// 出棧,繼續(xù)循環(huán)排列track.pop();}};backtrack(nums, track, used, 0);return result; }; //leetcode submit region end(Prohibit modification and deletion)復(fù)雜度
總結(jié)
以上是生活随笔為你收集整理的回溯法遵循深度优先吗_闲来刷下「回溯算法」的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go读取excel_Excelize发布
- 下一篇: 大众mpv_一汽-大众全新MPV车型国内