摘要:后面又想到了一種方式,一直累減標(biāo)準(zhǔn)答案深度優(yōu)先搜索算法英語(yǔ),簡(jiǎn)稱是一種用于遍歷或搜索樹(shù)或圖的算法。因發(fā)明深度優(yōu)先搜索算法,約翰霍普克洛夫特與羅伯特塔揚(yáng)共同獲得計(jì)算機(jī)領(lǐng)域的最高獎(jiǎng)圖靈獎(jiǎng)。
題目
最近在LeetCode上看到這么一道鏈接題目
給定一個(gè)由正整數(shù)組成的數(shù)組C和一個(gè)目標(biāo)數(shù)字T,查找C中所有的唯一組合,其中候選數(shù)字總和為T。
從C中抽出的數(shù)字可以無(wú)限重復(fù)。
來(lái)個(gè)例子: 數(shù)組[2, 3, 6, 7] 和 目標(biāo) 7 [2,4,5,8]
需要返回
[ [7], [2, 2, 3] ]解答
看完題目一開(kāi)始想的是把7%2,如果余0或者有與余數(shù)相等的值做為一個(gè)解。如 7%2=1, 2 + 1 = 3 --> [2, 2, 3], 但是一碰到 數(shù)組[2, 4, 5] 和 目標(biāo) 8的情況解歇菜了。
后面又想到了一種方式,一直累減:x_x
深度優(yōu)先搜索算法(英語(yǔ):Depth-First-Search,簡(jiǎn)稱DFS)是一種用于遍歷或搜索樹(shù)或圖的算法。沿著一個(gè)方向如果有未搜索的節(jié)點(diǎn)就一直搜索下去。
深度優(yōu)先的主要思想就是“不撞南墻不回頭”,“一條路走到黑”,如果遇到“墻”或者“無(wú)路可走”時(shí)再去走下一條路。
就像下圖,按照優(yōu)先級(jí)為右下左上順時(shí)針的方式嘗試移動(dòng),先往右走,但是有堵墻走不了,所以嘗試往下走,如果發(fā)現(xiàn)右下左上全都走不了了,就返回到上一個(gè)節(jié)點(diǎn)進(jìn)行移動(dòng)如3 -> 4, 25 -> 26 就是返回到上一個(gè)節(jié)點(diǎn)。 所以 遞歸沒(méi)得跑了。
在代碼實(shí)現(xiàn)上也有標(biāo)準(zhǔn)的模板:
void dfs() { // 判斷是否到達(dá)終點(diǎn) if() { return; } // 嘗試每一個(gè)可走方向(右下左上) for(i=0; i然后再把我們題目往模板里面一套
var combinationSum = function(candidates, target) { let result = [] let temp = [] dfs(0, 0, temp) return result function dfs(value, index, temp) { // 判斷累加和是否為target 或者 超出了 target if (value === target) { // 如果和為target就把當(dāng)前的數(shù)組記錄下來(lái)保存 result.push(temp.concat()) return } else if (value > target) { return } else { for (let i = index, len = arr.length; i < len; i++) { // 記錄下之前累加的數(shù)字 let newtemp = temp.concat(arr[i]) // 繼續(xù)下一步 dfs(value + arr[i], i, newtemp) } } } }LeetCode上還有性能更加好的解法,大家可以自己去觀摩一番,提高一下姿勢(shì)水平。
因發(fā)明“深度優(yōu)先搜索算法”,約翰·霍普克洛夫特與羅伯特·塔揚(yáng)共同獲得計(jì)算機(jī)領(lǐng)域的最高獎(jiǎng):圖靈獎(jiǎng)。做完這題最大的感受就是,智商不夠,套路來(lái)湊,得把基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法知識(shí)看熟啰。
ass♂we♂can
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/90368.html
摘要:深度優(yōu)先搜索復(fù)雜度時(shí)間空間遞歸棧空間思路因?yàn)槲覀兛梢匀我饨M合任意多個(gè)數(shù),看其和是否是目標(biāo)數(shù),而且還要返回所有可能的組合,所以我們必須遍歷所有可能性才能求解。這題是非常基本且典型的深度優(yōu)先搜索并返回路徑的題。本質(zhì)上是有限深度優(yōu)先搜索。 Combination Sum I Given a set of candidate numbers (C) and a target number (...
摘要:輸入輸出分析題目由于我們需要找到多個(gè)組合,簡(jiǎn)單的使用循環(huán)肯定是不行的,這時(shí)候我們可以使用回溯算法來(lái)解決這個(gè)問(wèn)題。用回溯算法解決問(wèn)題的一般步驟針對(duì)所給問(wèn)題,定義問(wèn)題的解空間,它至少包含問(wèn)題的一個(gè)最優(yōu)解。 題目描述 Given a set of candidate numbers (candidates) (without duplicates) and a target number ...
摘要:回溯算法在算法過(guò)程中就是類似于枚舉算法,嘗試在搜索過(guò)程中找到問(wèn)題的解。 回溯算法( BackTrack )在算法過(guò)程中就是類似于枚舉算法,嘗試在搜索過(guò)程中找到問(wèn)題的解。 使用回溯算法解題的一般步驟 使用回溯算法解題的一般步驟: 針對(duì)所給問(wèn)題得出一般的解空間 用回溯搜索方法搜索解空間 使用深度優(yōu)先去搜索所有解并包含適當(dāng)?shù)募糁Σ僮? LeetCode 使用回溯算法的題目主要有 36 題,...
摘要:所謂深度優(yōu)先算法,百科的解答是這樣的深度優(yōu)先搜索算法,簡(jiǎn)稱是搜索算法的一種。是沿著樹(shù)的深度遍歷樹(shù)的節(jié)點(diǎn),盡可能深的搜索樹(shù)的分支。這一過(guò)程一直進(jìn)行到已發(fā)現(xiàn)從源節(jié)點(diǎn)可達(dá)的所有節(jié)點(diǎn)為止。 所謂深度優(yōu)先算法,百科的解答是這樣的 深度優(yōu)先搜索算法(Depth-First-Search),簡(jiǎn)稱DFS,是搜索算法的一種。是沿著樹(shù)的深度遍歷樹(shù)的節(jié)點(diǎn),盡可能深的搜索樹(shù)的分支。當(dāng)節(jié)點(diǎn)v的所有邊都己被探尋過(guò)...
摘要:所謂深度優(yōu)先算法,百科的解答是這樣的深度優(yōu)先搜索算法,簡(jiǎn)稱是搜索算法的一種。是沿著樹(shù)的深度遍歷樹(shù)的節(jié)點(diǎn),盡可能深的搜索樹(shù)的分支。這一過(guò)程一直進(jìn)行到已發(fā)現(xiàn)從源節(jié)點(diǎn)可達(dá)的所有節(jié)點(diǎn)為止。 所謂深度優(yōu)先算法,百科的解答是這樣的 深度優(yōu)先搜索算法(Depth-First-Search),簡(jiǎn)稱DFS,是搜索算法的一種。是沿著樹(shù)的深度遍歷樹(shù)的節(jié)點(diǎn),盡可能深的搜索樹(shù)的分支。當(dāng)節(jié)點(diǎn)v的所有邊都己被探尋過(guò)...
閱讀 2852·2023-04-25 17:59
閱讀 682·2023-04-25 15:05
閱讀 673·2021-11-25 09:43
閱讀 3034·2021-10-12 10:13
閱讀 3537·2021-09-27 13:59
閱讀 3583·2021-09-23 11:21
閱讀 3879·2021-09-08 09:35
閱讀 566·2019-08-29 17:12