ËÑË÷Ò»°ãÖ¸ÔÚÓÐÏÞµÄ״̬¿Õ¼äÖнøÐÐö¾Ù£¬Í¨¹ýÇËùÓеĿÉÄÜÀ´ÕÒµ½·ûºÏÌõ¼þµÄ½â»òÕß½âµÄ¸öÊý¡£¸ù¾ÝËÑË÷·½Ê½µÄ²»Í¬£¬ËÑË÷Ëã·¨¿ÉÒÔ·ÖΪ DFS£¬BFS£¬A*Ëã·¨µÈ¡£ÕâÀïÖ»½éÉÜ DFS ºÍ BFS£¬ÒÔ¼°·¢ÉúÔÚ DFS ÉÏÒ»ÖÖ¼¼ÇÉ-»ØËÝ¡£
ËÑË÷ÎÊÌ⸲¸ÇÃæ·Ç³£¹ã·º£¬²¢ÇÒÔÚËã·¨ÌâÖÐÒ²Õ¼¾ÝÁ˺ܸߵıÈÀý¡£ÎÒÉõÖÁ»¹ÔÚ¹«¿ªÑݽ²ÖÐÌáµ½ÁË Ç°¶ËËã·¨ÃæÊÔÖÐËÑË÷ÀàÕ¼¾ÝÁ˺ܴóµÄ±ÈÖØ£¬ÓÈÆäÊǹúÄÚ¹«Ë¾¡£
ËÑË÷רÌâÖеÄ×ÓרÌâÓкܶ࣬¶ø´ó¼ÒËùÊìÖªµÄ BFS£¬DFS Ö»ÊÇÆäÖÐÌرð»ù´¡µÄÄÚÈÝ¡£³ý´ËÖ®Í⣬»¹ÓÐ״̬¼Ç¼Óëά»¤£¬¼ôÖ¦£¬ÁªÍ¨·ÖÁ¿£¬ÍØÆËÅÅÐòµÈµÈ¡£ÕâЩÄÚÈÝ£¬ÎÒ»áÔÚÕâÀïÒ»Ò»¸ø´ó¼Ò½éÉÜ¡£
ÁíÍ⼴ʹ½ö½ö¿¼ÂÇ DFS ºÍ BFS Á½ÖÖ»ù±¾Ëã·¨£¬ÀïÃæÄÜÍæµÄ»¨ÑùÒ²·Ç³£¶à¡£±ÈÈç BFS µÄË«ÏòËÑË÷£¬±ÈÈç DFS µÄÇ°ÖкóÐò£¬µü´ú¼ÓÉîµÈµÈ¡£
¹ØÓÚËÑË÷£¬ÆäʵÔÚ¶þ²æÊ÷²¿·ÖÒѾ×öÁ˽éÉÜÁË¡£¶øÕâÀïµÄËÑË÷£¬Æäʵ¾ÍÊǽøÒ»²½µÄ·º»¯¡£Êý¾Ý½á¹¹²»ÔÙ¾ÖÏÞÓÚÇ°ÃæÌáµ½µÄÊý×飬Á´±í»òÕßÊ÷¡£¶øÀ©Õ¹µ½ÁËÖîÈç¶þάÊý×飬¶à²æÊ÷£¬Í¼µÈ¡£²»¹ýºËÐÄÈÔÈ»ÊÇÒ»ÑùµÄ£¬Ö»²»¹ýÊý¾Ý½á¹¹·¢ÉúÁ˱仯¶øÒÑ¡£
ʵ¼ÊÉÏËÑË÷ÌâÄ¿±¾ÖʾÍÊǽ«ÌâÄ¿ÖеÄ״̬ӳÉäΪͼÖеĵ㣬½«×´Ì¬¼äµÄÁªÏµÓ³ÉäΪͼÖеıߡ£¸ù¾ÝÌâÄ¿ÐÅÏ¢¹¹½¨×´Ì¬¿Õ¼ä£¬È»ºó¶Ô״̬¿Õ¼ä½øÐбéÀú£¬±éÀú¹ý³ÌÐèÒª¼Ç¼ºÍά»¤×´Ì¬£¬²¢Í¨¹ý¼ôÖ¦ºÍÊý¾Ý½á¹¹µÈÌá¸ßËÑË÷ЧÂÊ¡£
״̬¿Õ¼äµÄÊý¾Ý½á¹¹²»Í¬»áµ¼ÖÂËã·¨²»Í¬¡£±ÈÈç¶ÔÊý×é½øÐÐËÑË÷£¬ºÍ¶ÔÊ÷£¬Í¼½øÐÐËÑË÷¾Í²»Ì«Ò»Ñù¡£
ÔÙ´ÎÇ¿µ÷һϣ¬ÎÒÕâÀï½²µÄÊý×飬Ê÷ºÍͼÊÇ״̬¿Õ¼äµÄÂß¼½á¹¹£¬¶ø²»ÊÇÌâÄ¿¸øµÄÊý¾Ý½á¹¹¡£±ÈÈçÌâÄ¿¸øÁËÒ»¸öÊý×飬ÈÃÄãÇóÊý×éµÄËÑË÷×Ó¼¯¡£ËäÈ»ÌâÄ¿¸øµÄÏßÐÔµÄÊý¾Ý½á¹¹Êý×飬Ȼ¶øʵ¼ÊÉÏÎÒÃÇÊǶÔÊ÷ÕâÖÖ·ÇÏßÐÔÊý¾Ý½á¹¹½øÐÐËÑË÷¡£ÕâÊÇÒòΪÕâµÀÌâ¶ÔÓ¦µÄ״̬¿Õ¼äÊÇ·ÇÏßÐԵġ£
¶ÔÓÚËÑË÷ÎÊÌ⣬ÎÒÃǺËÐĹØ×¢µÄÐÅÏ¢ÓÐÄÄЩ£¿ÓÖ¸ÃÈçºÎ¼ÆËãÄØ£¿ÕâÒ²ÊÇËÑË÷ƪºËÐĹØ×¢µÄ¡£¶øÊÐÃæÉϺܶà×ÊÁϽ²ÊöµÄ²»ÊǺÜÏêϸ¡£ËÑË÷µÄºËÐÄÐèÒª¹Ø×¢µÄÖ¸±êÓкܶ࣬±ÈÈçÊ÷µÄÉî¶È£¬Í¼µÄ DFS Ðò£¬Í¼ÖÐÁ½µã¼äµÄ¾àÀëµÈµÈ¡£ÕâЩָ±ê¶¼ÊÇÍê³É¸ß¼¶Ëã·¨±Ø²»¿ÉÉٵģ¬¶øÕâЩָ±ê¿ÉÒÔͨ¹ýһЩ¾µäËã·¨À´ÊµÏÖ¡£ÕâÒ²ÊÇΪʲôÎÒһֱǿµ÷Ò»¶¨ÒªÏÈѧϰºÃ»ù´¡µÄÊý¾Ý½á¹¹ÓëËã·¨µÄÔÒò¡£
²»¹ýÒª½²ÕâЩ½²ÊöÍêÕû²¢·ÇÈÝÒ×£¬ÒÔÖÁÓÚÈç¹ûÍêÕûдÍê¿ÉÄÜÐèÒª»¨ºÜ¶àµÄʱ¼ä£¬Òò´ËһֱûÓж¯ÊÖȥд¡£
ÁíÍâÓÉÓÚÆäËûÊý¾Ý½á¹¹¶¼¿ÉÒÔ¿´×öÊÇͼµÄÌØÀý¡£Òò´ËÑо¿Í¸Í¼µÄ»ù±¾Ë¼Ï룬¾ÍºÜÈÝÒ×½«ÆäÀ©Õ¹µ½ÆäËûÊý¾Ý½á¹¹ÉÏ£¬±ÈÈçÊ÷¡£Òò´ËÎÒ´òËãΧÈÆͼ½øÐн²½â£¬²¢Öð²½¾ßÏ󻯵½ÆäËûÌØÊâµÄÊý¾Ý½á¹¹£¬±ÈÈçÊ÷¡£
½áÂÛÏÈÐУº×´Ì¬¿Õ¼äÆäʵ¾ÍÊÇÒ»¸öͼ½á¹¹£¬Í¼ÖеĽڵã±íʾ״̬£¬Í¼Öеı߱íʾ״̬֮ǰµÄÁªÏµ£¬ÕâÖÖÁªÏµ¾ÍÊÇÌâÄ¿¸ø³öµÄ¸÷ÖÖ¹Øϵ¡£
ËÑË÷ÌâÄ¿µÄ״̬¿Õ¼äͨ³£ÊÇ·ÇÏßÐԵġ£±ÈÈçÉÏÃæÌáµ½µÄÀý×Ó£ºÇóÒ»¸öÊý×éµÄ×Ó¼¯¡£ÕâÀïµÄ״̬¿Õ¼äʵ¼ÊÉϾÍÊÇÊý×éµÄ¸÷ÖÖ×éºÏ¡£
¶ÔÓÚÕâµÀÌâÀ´Ëµ£¬Æä״̬¿Õ¼äµÄÒ»ÖÖ¿ÉÐеĻ®·Ö·½Ê½Îª£º
¶øÈçºÎÈ·¶¨ÉÏÃæËùÓеÄ×Ó¼¯ÄØ¡£
Ò»ÖÖ¿ÉÐеķ½°¸ÊÇ¿ÉÒÔ²ÉÈ¡ÀàËÆ·ÖÖεķ½Ê½Öðһȷ¶¨¡£
±ÈÈçÎÒÃÇ¿ÉÒÔ£º
ÈçºÎÈ·¶¨µÚÒ»¸öÊý£¬µÚ¶þ¸öÊý¡£¡£¡£ÄØ£¿
±©Á¦Ã¶¾ÙËùÓпÉÄܾͿÉÒÔÁË¡£
Õâ¾ÍÊÇËÑË÷ÎÊÌâµÄºËÐÄ£¬ÆäËû¶¼ÊǸ¨Öú£¬ËùÒÔÕâ¾ä»°ÇëÎñ±Ø¼Çס¡£
ËùνµÄ±©Á¦Ã¶¾ÙËùÓпÉÄÜÔÚÕâÀï¾ÍÊdz¢ÊÔÊý×éÖÐËùÓпÉÄܵÄÊý×Ö¡£
¾Ý´Ë£¬Äã¿ÉÒÔ»³öÈçϵľö²ßÊ÷¡£
£¨ÏÂͼÃèÊöµÄÊǶÔÒ»¸ö³¤¶ÈΪ 3 µÄÊý×é½øÐоö²ßµÄ²¿·Ö¹ý³Ì£¬Ê÷½ÚµãÖеÄÊý×Ö±íʾË÷Òý¡£¼´È·¶¨µÚÒ»¸öÊýÓÐÈý¸öÑ¡Ôñ£¬È·¶¨µÚ¶þ¸öÊý»á¸ù¾ÝÉϴεÄÑ¡Ôñ±äΪʣϵÄÁ½¸öÑ¡Ôñ£©
¾ö²ß¹ý³Ì¶¯Í¼ÑÝʾ£º
һЩËÑË÷Ëã·¨¾ÍÊÇ»ùÓÚÕâ¸öÆÓËصÄ˼Ï룬±¾ÖʾÍÊÇÄ£ÄâÕâ¸ö¾ö²ßÊ÷¡£ÕâÀïÃæÆäʵҲÓкܶàÓÐȤµÄϸ½Ú£¬ºóÃæÎÒÃÇ»á¶ÔÆä½øÐиü¼ÓÏêϸµÄ½²½â¡£¶øÏÖÔÚ´ó¼ÒÖ»ÐèÒª¶Ô½â¿Õ¼äÊÇʲôÒÔ¼°ÈçºÎ¶Ô½â¿Õ¼ä½øÐбéÀúÓÐÒ»µã¸ÅÄî¾ÍÐÐÁË¡£ ºóÃæÎÒ»á¼ÌÐø¶ÔÕâ¸ö¸ÅÄî½øÐмÓÉî¡£
ÕâÀï´ó¼ÒÖ»Òª¼Çס״̬¿Õ¼ä¾ÍÊÇͼ£¬¹¹½¨×´Ì¬¿Õ¼ä¾ÍÊǹ¹½¨Í¼¡£ÈçºÎ¹¹½¨ÄØ£¿µ±È»ÊǸù¾ÝÌâÄ¿ÃèÊöÁË ¡£
DFS ºÍ BFS ÊÇËÑË÷µÄºËÐÄ£¬¹á´©ËÑË÷ƪµÄʼÖÕ£¬Òò´ËÓбØÒªÏȶÔÆä½øÐн²½â¡£
DFS µÄ¸ÅÄîÀ´×ÔÓÚͼÂÛ£¬µ«ÊÇËÑË÷ÖÐ DFS ºÍͼÂÛÖÐ DFS »¹ÊÇÓÐһЩÇø±ð£¬ËÑË÷ÖÐ DFS Ò»°ãÖ¸µÄÊÇͨ¹ýµÝ¹éº¯ÊýʵÏÖ±©Á¦Ã¶¾Ù¡£
Èç¹û²»Ê¹Óõݹ飬Ҳ¿ÉÒÔʹÓÃÕ»À´ÊµÏÖ¡£²»¹ý±¾ÖÊÉÏÊÇÀàËƵġ£
Ê×ÏȽ«ÌâÄ¿µÄ״̬¿Õ¼äÓ³Éäµ½Ò»ÕÅͼ£¬×´Ì¬¾ÍÊÇͼÖеĽڵ㣬״̬֮¼äµÄÁªÏµ¾ÍÊÇͼÖеıߣ¬ÄÇô DFS ¾ÍÊÇÔÚÕâÖÖͼÉϽøÐÐÉî¶ÈÓÅÏȵıéÀú¡£¶ø BFS Ò²ÊÇÀàËÆ£¬Ö»²»¹ý±éÀúµÄ²ßÂÔ±äΪÁ˹ã¶ÈÓÅÏÈ£¬Ò»²ã²ãÆÌ¿ª¶øÒÑ¡£ËùÒÔBFS ºÍ DFS Ö»ÊDZéÀúÕâ¸ö״̬ͼµÄÁ½ÖÖ·½Ê½°ÕÁË£¬ÈçºÎ¹¹½¨×´Ì¬Í¼²ÅÊǹؼü¡£
±¾ÖÊÉÏ£¬¶ÔÉÏÃæµÄͼ½øÐбéÀúµÄ»°»áÉú³ÉÒ»¿ÅËÑË÷Ê÷¡£ÎªÁ˱ÜÃâÖظ´·ÃÎÊ£¬ÎÒÃÇÐèÒª¼Ç¼ÒѾ·ÃÎʹýµÄ½Úµã¡£ÕâЩÊÇËùÓеÄËÑË÷Ëã·¨¹²Óеģ¬ºóÃæ²»ÔÙ׸Êö¡£
Èç¹ûÄãÊÇÔÚÊ÷ÉϽøÐбéÀú£¬ÊDz»»áÓл·µÄ£¬Ò²×ÔÈ»²»ÐèҪΪÁ˱ÜÃâ»·µÄ²úÉú¼Ç¼ÒѾ·ÃÎʵĽڵ㣬ÕâÊÇÒòΪÊ÷±¾ÖÊÉÏÊÇÒ»¸ö¼òµ¥ÎÞ»·Í¼¡£
ÕâÀïµÄ stack ¿ÉÒÔÀí½âΪ×ÔʵÏÖµÄÕ»£¬Ò²¿ÉÒÔÀí½âΪµ÷ÓÃÕ»
ÏÂÃæÎÒÃǽèÖúµÝ¹éÀ´Íê³É DFS¡£
const visited = {}
function dfs(i) {
if (Âú×ãÌض¨Ìõ¼þ£©{
// ·µ»Ø½á¹û or Í˳öËÑË÷¿Õ¼ä
}
visited[i] = true // ½«µ±Ç°×´Ì¬±êΪÒÑËÑË÷
for (¸ù¾ÝiÄܵ½´ïµÄϸö״̬j) {
if (!visited[j]) { // Èç¹û״̬jûÓб»ËÑË÷¹ý
dfs(j)
}
}
}
DFS ³£¼ûµÄÐÎʽÓÐÇ°ÐòºÍºóÐò¡£¶þÕßµÄʹÓó¡¾°Ò²ÊǽØÈ»²»Í¬µÄ¡£
ÉÏÃæ½²ÊöÁËËÑË÷±¾ÖʾÍÊÇÔÚ״̬¿Õ¼ä½øÐбéÀú£¬¿Õ¼äÖеÄ״̬¿ÉÒÔ³éÏóΪͼÖеĵ㡣ÄÇôÈç¹ûËÑË÷¹ý³ÌÖУ¬µ±Ç°µãµÄ½á¹ûÐèÒªÒÀÀµÆäËû½Úµã£¨´ó¶àÊýÇé¿ö¶¼»áÓÐÒÀÀµ£©£¬ÄÇô±éÀú˳Ðò¾Í±äµÃÖØÒª¡£
±ÈÈ統ǰ½ÚµãÐèÒªÒÀÀµÆä×Ó½ÚµãµÄ¼ÆËãÐÅÏ¢£¬ÄÇôʹÓúóÐò±éÀú×Ôµ×ÏòÉϵÝÍƾÍÏԵñØÒªÁË¡£¶øÈç¹ûµ±Ç°½ÚµãÐèÒªÒÀÀµÆ丸½ÚµãµÄÐÅÏ¢£¬ÄÇôʹÓÃÏÈÐò±éÀú½øÐÐ×Ô¶¥Ïòϵĵݹé¾Í²»ÄÑÏëµ½¡£
±ÈÈçÏÂÎÄÒª½²µÄ¼ÆËãÊ÷µÄÉî¶È¡£ÓÉÓÚÊ÷µÄÉî¶ÈµÄµÝ¹é¹«Ê½Îª£º $f(x) = f(y) + 1$¡£ÆäÖÐ f(x) ±íʾ½Úµã x µÄÉî¶È£¬²¢ÇÒ x ÊÇ y µÄ×ӽڵ㡣ºÜÃ÷ÏÔÕâ¸öµÝÍƹ«Ê½µÄ base case ¾ÍÊǸù½ÚµãÉî¶ÈΪһ£¬Í¨¹ýÕâ¸ö base case ÎÒÃÇ¿ÉÒÔµÝÍÆÇó³öÊ÷ÖÐÈÎÒâ½ÚµãµÄÉî¶È¡£ÏÔÈ»£¬Ê¹ÓÃÏÈÐò±éÀú×Ô¶¥Ïòϵķ½Ê½Í³¼ÆÊǼòµ¥¶øÓÖÖ±½ÓµÄ¡£
ÔÙ±ÈÈçÏÂÎÄÒª½²µÄ¼ÆËãÊ÷µÄ×Ó½Úµã¸öÊý¡£ÓÉÓÚÊ÷µÄ×Ó½ÚµãµÝ¹é¹«Ê½Îª£º $f(x) = sum_{i=0}^{n}{f(a_i)}$ ÆäÖÐ x ΪÊ÷ÖеÄijһ¸ö½Úµã£¬$a_i$ ΪÊ÷ÖнڵãµÄ×ӽڵ㡣¶ø base case ÔòÊÇûÓÐÈκÎ×Ó½Úµã(Ò²¾ÍÊÇÒ¶×Ó½Úµã)£¬´Ëʱ $f(x) = 1$¡£ Òò´ËÎÒÃÇ¿ÉÒÔÀûÓúóÐò±éÀú×Ôµ×ÏòÉÏÀ´Íê³É×Ó½Úµã¸öÊýµÄͳ¼Æ¡£
¹ØÓÚ´ÓµÝÍƹØϵ·ÖÎöʹÓúÎÖÖ±éÀú·½·¨£¬ ÎÒÔÚ¡¶91 ÌìѧËã·¨¡·ÖеĻù´¡ÆªÖеġ¶Ä£Ä⣬ö¾ÙÓëµÝÍÆ¡·×ÓרÌâÖжԴ˽øÐÐÁËÏêϸµÄÃèÊö¡£91 ѧԱ¿ÉÒÔÖ±½Ó½øÐв鿴¡£¹ØÓÚÊ÷µÄ¸÷ÖÖ±éÀú·½·¨£¬ÎÒÔÚÊ÷רÌâÖнøÐÐÁËÏêϸµÄ½éÉÜ¡£
µü´ú¼ÓÉî±¾ÖÊÉÏÊÇÒ»ÖÖ¿ÉÐÐÐԵļôÖ¦¡£¹ØÓÚ¼ôÖ¦£¬ÎÒ»áÔÚºóÃæµÄ¡¶»ØËÝÓë¼ôÖ¦¡·²¿·Ö×ö¸ü¶àµÄ½éÉÜ¡£
Ëùνµü´ú¼ÓÉîÖ¸µÄÊÇÔڵݹéÊ÷±È½ÏÉîµÄʱºò£¬Í¨¹ýÉ趨µÝ¹éÉî¶ÈãÐÖµ£¬³¬¹ýãÐÖµ¾ÍÍ˳öµÄ·½Ê½Ö÷¶¯¼õÉٵݹéÉî¶ÈµÄÓÅ»¯ÊֶΡ£ÕâÖÖËã·¨³ÉÁ¢µÄÇ°ÌáÊÇÌâÄ¿ÖиæËßÎÒÃǴ𰸲»³¬¹ý xxx£¬ÕâÑùÎÒÃÇ¿ÉÒÔ½« xxx ×÷ΪµÝ¹éÉî¶ÈãÐÖµ£¬ÕâÑù²»½ö²»»á´í¹ýÕýÈ·½â£¬»¹ÄÜÔÚ¼«¶ËÇé¿öÏÂÓÐЧ¼õÉÙ²»±ØÐëµÄÔËËã¡£
¾ßÌåµØ£¬ÎÒÃÇ¿ÉÒÔʹÓÃ×Ô¶¥Ïòϵķ½Ê½¼Ç¼µÝ¹éÊ÷µÄ²ã´Î£¬ºÍÉÏÃæ½éÉÜÈçºÎ¼ÆËãÊ÷Éî¶ÈµÄ·½·¨ÊÇÒ»ÑùµÄ¡£½ÓÏÂÀ´ÔÚÖ÷Â߼ǰÔö¼Óµ±Ç°²ã´ÎÊÇ·ñ³¬¹ýãÐÖµµÄÅжϼ´¿É¡£
Ö÷´úÂ룺
MAX_LEVEL = 20
def dfs(root, level):
if level > MAX_LEVEL: return
# Ö÷Âß¼
dfs(root, 0)
ÕâÖÖ¼¼ÇÉÔÚʵ¼ÊʹÓÃÖв¢²»³£¼û£¬²»¹ýÔÚijЩʱºòÄÜ·¢»ÓÒâÏë²»µ½µÄ×÷Óá£
ÓÐʱºòÎÊÌâ¹æÄ£ºÜ´ó£¬Ö±½ÓËÑË÷»á³¬Ê±¡£´Ëʱ¿ÉÒÔ¿¼ÂÇ´ÓÆðµãËÑË÷µ½ÎÊÌâ¹æÄ£µÄÒ»°ë¡£È»ºó½«´Ë¹ý³ÌÖвúÉúµÄ״̬´æÆðÀ´¡£½ÓÏÂÀ´Ä¿±êת»¯ÎªÔÚ´æ´¢µÄÖмä״̬ÖÐÑ°ÕÒÂú×ãÌõ¼þµÄ״̬¡£½ø¶ø´ïµ½½µµÍʱ¼ä¸´ÔӶȵÄЧ¹û¡£
ÉÏÃæµÄ˵·¨¿ÉÄܲ»Ì«ÈÝÒ×Àí½â¡£ ½ÓÏÂÀ´Í¨¹ýÒ»¸öÀý×Ó°ïÖú´ó¼ÒÀí½â¡£
https://leetcode-cn.com/probl...
¸øÄãÒ»¸öÕûÊýÊý×é nums ºÍÒ»¸öÄ¿±êÖµ goal ¡£
ÄãÐèÒª´Ó nums ÖÐÑ¡³öÒ»¸ö×ÓÐòÁУ¬Ê¹×ÓÐòÁÐÔªËØ×ܺÍ×î½Ó½ü goal ¡£Ò²¾ÍÊÇ˵£¬Èç¹û×ÓÐòÁÐÔªËغÍΪ sum £¬ÄãÐèÒª ×îС»¯¾ø¶Ô²î abs(sum - goal) ¡£
·µ»Ø abs(sum - goal) ¿ÉÄÜµÄ ×îСֵ ¡£
×¢Ò⣬Êý×éµÄ×ÓÐòÁÐÊÇͨ¹ýÒƳýÔʼÊý×éÖеÄijЩԪËØ£¨¿ÉÄÜÈ«²¿»òÎÞ£©¶øÐγɵÄÊý×é¡£
?
ʾÀý 1£º
ÊäÈ룺nums = [5,-7,3,5], goal = 6
Êä³ö£º0
½âÊÍ£ºÑ¡ÔñÕû¸öÊý×é×÷Ϊѡ³öµÄ×ÓÐòÁУ¬ÔªËغÍΪ 6 ¡£
×ÓÐòÁкÍÓëÄ¿±êÖµÏàµÈ£¬ËùÒÔ¾ø¶Ô²îΪ 0 ¡£
ʾÀý 2£º
ÊäÈ룺nums = [7,-9,15,-2], goal = -5
Êä³ö£º1
½âÊÍ£ºÑ¡³ö×ÓÐòÁÐ [7,-9,-2] £¬ÔªËغÍΪ -4 ¡£
¾ø¶Ô²îΪ abs(-4 - (-5)) = abs(1) = 1 £¬ÊÇ¿ÉÄܵÄ×îСֵ¡£
ʾÀý 3£º
ÊäÈ룺nums = [1,2,3], goal = -7
Êä³ö£º7
?
Ìáʾ£º
1 <= nums.length <= 40
-10^7 <= nums[i] <= 10^7
-10^9 <= goal <= 10^9
´ÓÊý¾Ý·¶Î§¿ÉÒÔ¿´³ö£¬ÕâµÀÌâ´ó¸ÅÂÊÊÇÒ»¸ö $O(2^m)$ ʱ¼ä¸´ÔӶȵĽⷨ£¬ÆäÖÐ m ÊÇ nums.length µÄÒ»°ë¡£
Ϊʲô£¿Ê×ÏÈÈç¹ûÌâÄ¿Êý×鳤¶ÈÏÞÖÆΪСÓÚµÈÓÚ 20£¬ÄÇô´ó¸ÅÂÊÊÇÒ»¸ö $O(2^n)$ µÄ½â·¨¡£
Èç¹ûÕâ¸öÒ²²»ÖªµÀ£¬½¨Òé¿´Ò»ÏÂÕâƪÎÄÕ https://lucifer.ren/blog/2020... ÁíÍâÎÒµÄË¢Ìâ²å¼þ leetcode-cheatsheet Ò²¸ø³öÁËʱ¼ä¸´ÔÓ¶ÈËÙ²é±í¹©´ó¼Ò²Î¿¼¡£
½« 40 ¿³°ëÇ¡ºÃ¾Í¿ÉÒÔ AC ÁË¡£Êµ¼ÊÉÏ£¬40 Õâ¸öÊý×Ö¾ÍÊÇÒ»¸öÇ¿ÓÐÁ¦µÄÐźš£
»Øµ½ÌâÄ¿ÖС£ÎÒÃÇ¿ÉÒÔÓÃÒ»¸ö¶þ½øÖÆλ±íʾÔÊý×é nums µÄÒ»¸ö×Ó¼¯£¬ÕâÑùÓÃÒ»¸ö³¤¶ÈΪ $2^n$ µÄÊý×é¾Í¿ÉÒÔÃèÊö nums µÄËùÓÐ×Ó¼¯ÁË£¬Õâ¾ÍÊÇ״̬ѹËõ¡£Ò»°ãÌâÄ¿Êý¾Ý·¶Î§ÊÇ <= 20 ¶¼Ó¦¸ÃÏëµ½¡£
ÕâÀï 40 ÕÛ°ë¾ÍÊÇ 20 ÁË¡£
Èç¹û²»ÊìϤ״̬ѹËõ£¬¿ÉÒÔ¿´ÏÂÎÒµÄÕâƪÎÄÕ ״ѹ DP ÊÇʲô£¿ÕâƪÌâ½â´øÄãÈëÃÅ
½ÓÏÂÀ´£¬ÎÒÃÇʹÓö¯Ì¬¹æ»®Çó³öËùÓеÄ×Ó¼¯ºÍ¡£
ÕâÒ²²»ÄÑÇó³ö£¬×ªÒÆ·½³ÌΪ £º dp[(1 << i) + j] = dp[j] + A[i]
£¬ÆäÖÐ j Ϊ i µÄ×Ó¼¯£¬i ºÍ j ¶¼ÊÇÊý×Ö£¬i ºÍ j µÄ¶þ½øÖƱíʾµÄÊÇ nums µÄÑ¡ÔñÇé¿ö¡£
¶¯Ì¬¹æ»®Çó×Ó¼¯ºÍ´úÂëÈçÏ£º
def combine_sum(A):
n = len(A)
dp = [0] * (1 << n)
for i in range(n):
for j in range(1 << i):
dp[(1 << i) + j] = dp[j] + A[i]
return dp
½ÓÏÂÀ´£¬ÎÒÃǽ« nums ƽ·ÖΪÁ½²¿·Ö£¬·Ö±ð¼ÆËã×Ó¼¯ºÍ£º
n = len(nums)
c1 = combine_sum(nums[: n // 2])
c2 = combine_sum(nums[n // 2 :])
ÆäÖÐ c1 ¾ÍÊÇÇ°°ë²¿·ÖÊý×éµÄ×Ó¼¯ºÍ£¬c2 ¾ÍÊǺó°ë²¿·ÖµÄ×Ó¼¯ºÍ¡£
½ÓÏÂÀ´ÎÊÌâת»¯Îª£ºÔÚÁ½¸öÊý×é c1 ºÍ c2ÖÐÕÒÁ½¸öÊý£¬ÆäºÍ×î½Ó½ü goal
¡£¶øÕâÊÇÒ»¸ö·Ç³£¾µäµÄË«Ö¸ÕëÎÊÌ⣬Âß¼ÀàËÆÁ½ÊýºÍ¡£
Ö»²»¹ýÁ½ÊýºÍÊÇÒ»¸öÊý×éÌôÁ½¸öÊý£¬ÕâÀïÊÇÁ½¸öÊý×é·Ö±ðÌôÒ»¸öÊý°ÕÁË¡£
ÕâÀïÆäʵֻÐèÒªÒ»¸öÖ¸ÕëÖ¸ÏòÒ»¸öÊý×éµÄÍ·£¬ÁíÍâÒ»¸öÖ¸ÏòÁíÍâÒ»¸öÊý×éµÄβ¼´¿É¡£
´úÂë²»ÄÑд³ö£º
def combine_closest(c1, c2):
# ÏÈÅÅÐòÒÔ±ãʹÓÃË«Ö¸Õë
c1.sort()
c2.sort()
ans = float("inf")
i, j = 0, len(c2) - 1
while i < len(c1) and j >= 0:
_sum = c1[i] + c2[j]
ans = min(ans, abs(_sum - goal))
if _sum > goal:
j -= 1
elif _sum < goal:
i += 1
else:
return 0
return ans
ÉÏÃæÕâ¸ö´úÂë²»¶®µÄ¶à¿´¿´Á½ÊýºÍ¡£
´úÂëÖ§³Ö£ºPython3
Python3 Code:
class Solution:
def minAbsDifference(self, nums: List[int], goal: int) -> int:
def combine_sum(A):
n = len(A)
dp = [0] * (1 << n)
for i in range(n):
for j in range(1 << i):
dp[(1 << i) + j] = dp[j] + A[i]
return dp
def combine_closest(c1, c2):
c1.sort()
c2.sort()
ans = float("inf")
i, j = 0, len(c2) - 1
while i < len(c1) and j >= 0:
_sum = c1[i] + c2[j]
ans = min(ans, abs(_sum - goal))
if _sum > goal:
j -= 1
elif _sum < goal:
i += 1
else:
return 0
return ans
n = len(nums)
return combine_closest(combine_sum(nums[: n // 2]), combine_sum(nums[n // 2 :]))
¸´ÔӶȷÖÎö
Áî n ΪÊý×鳤¶È, m Ϊ $\frac{n}{2}$¡£
Ïà¹ØÌâÄ¿ÍƼö£º
ÕâµÀÌâºÍË«ÏòËÑË÷ÓÐʲô¹ØϵÄØ£¿
»ØһϿªÍ·ÎҵĻ°£ºÓÐʱºòÎÊÌâ¹æÄ£ºÜ´ó£¬Ö±½ÓËÑË÷»á³¬Ê±¡£´Ëʱ¿ÉÒÔ¿¼ÂÇ´ÓÆðµãËÑË÷µ½ÎÊÌâ¹æÄ£µÄÒ»°ë¡£È»ºó½«´Ë¹ý³ÌÖвúÉúµÄ״̬´æÆðÀ´¡£½ÓÏÂÀ´Ä¿±êת»¯ÎªÔÚ´æ´¢µÄÖмä״̬ÖÐÑ°ÕÒÂú×ãÌõ¼þµÄ״̬¡£½ø¶ø´ïµ½½µµÍʱ¼ä¸´ÔӶȵÄЧ¹û¡£
¶ÔÓ¦ÕâµÀÌ⣬ÎÒÃÇÈç¹ûÖ±½Ó±©Á¦ËÑË÷¡£ÄǾÍÊÇö¾ÙËùÓÐ×Ó¼¯ºÍ£¬È»ºóÕÒµ½ºÍ goal ×î½Ó½üµÄ£¬Ë¼Â·¼òµ¥Ö±½Ó¡£¿ÉÊÇÕâÑù»á³¬Ê±£¬ÄÇô¾ÍËÑË÷µ½Ò»°ë£¬ È»ºó½«×´Ì¬´æÆðÀ´£¨¶ÔÓ¦ÕâµÀÌâ¾ÍÊÇ´æµ½ÁË dp Êý×飩¡£½ÓÏÂÀ´ÎÊÌâת»¯ÎªÁ½¸ö dp Êý×éµÄÔËËã¡£¸ÃËã·¨£¬±¾ÖÊÉÏÊǽ«Î»ÓÚÖ¸ÊýλµÄ³£ÊýÏîŲ¶¯µ½ÁËϵÊýλ¡£ÕâÊÇÒ»ÖÖ³£¼ûµÄË«ÏòËÑË÷£¬ÎÒ¹ÃÇÒ³ÆΪ DFS µÄË«ÏòËÑË÷¡£Ä¿µÄÊÇΪÁ˺ͺóÃæµÄ BFS Ë«ÏòËÑË÷½øÐÐÇø·Ö¡£
BFS Ò²ÊÇͼÂÛÖÐËã·¨µÄÒ»ÖÖ¡£²»Í¬ÓÚ DFS£¬ BFS ²ÉÓúáÏòËÑË÷µÄ·½Ê½£¬´Ó³õʼ״̬һ²ã²ãÕ¹¿ªÖ±µ½Ä¿±ê״̬£¬ÔÚÊý¾Ý½á¹¹ÉÏͨ³£²ÉÓöÓÁнṹ¡£
¾ßÌåµØ£¬ÎÒÃDz»¶Ï´Ó¶ÓÍ·È¡³ö״̬£¬È»ºó½«´Ë״̬¶ÔÓ¦µÄ¾ö²ß²úÉúµÄËùÓÐеÄ״̬ÍÆÈë¶Ó⣬Öظ´ÒÔÉϹý³ÌÖ±ÖÁ¶ÓÁÐΪ¿Õ¼´¿É¡£
×¢ÒâÕâÀïÓÐÁ½¸ö¹Ø¼üµã£º
×î¼òµ¥µÄ BFS ÿ´ÎÀ©Õ¹ÐµÄ״̬¾ÍÔö¼ÓÒ»²½£¬Í¨¹ýÕâÑùÒ»²½²½±Æ½ü´ð°¸¡£ÆäʵҲ¾ÍµÈ¼ÛÓÚÔÚÒ»¸öȨֵΪ 1 µÄͼÉϽøÐÐ BFS¡£ÓÉÓÚ¶ÓÁеĵ¥µ÷ÐԺͶþÖµÐÔ£¬µ±µÚÒ»´ÎÈ¡³öÄ¿±ê״̬ʱ¾ÍÊÇ×îÉٵIJ½Êý¡£»ùÓÚÕâ¸öÌØÐÔ£¬BFS ÊʺÏÇó½âһЩ×îÉÙ²Ù×÷µÄÌâÄ¿¡£
¹ØÓÚµ¥µ÷ÐԺͶþÖµÐÔ£¬ÎÒ»áÔÚºóÃæµÄ BFS ºÍ DFS µÄ¶Ô±ÈÄÇ¿é½øÐн²½â¡£
Ç°Ãæ DFS ²¿·ÖÌáµ½Á˲»¹ÜÊÇʲôËÑË÷¶¼ÐèÒª¼Ç¼ºÍά»¤×´Ì¬£¬ÆäÖÐÒ»¸ö¾ÍÊǽڵã·ÃÎÊ״̬ÒÔ·ÀÖ¹»·µÄ²úÉú¡£¶ø BFS ÖÐÎÒÃdz£³£ÓÃÀ´ÇóµãµÄ×î¶Ì¾àÀë¡£ÖµµÃ×¢ÒâµÄÊÇ£¬ÓÐʱºòÎÒÃÇ»áʹÓÃÒ»¸ö¹þÏ£±í dist À´¼Ç¼´ÓÔ´µãµ½Í¼ÖÐÆäËûµãµÄ¾àÀë¡£Õâ¸ö dist Ò²¿ÉÒԳ䵱·ÀÖ¹»·²úÉúµÄ¹¦ÄÜ£¬ÕâÊÇÒòΪµÚÒ»´Îµ½´ïÒ»¸öµãºóÔٴε½´ï´ËµãµÄ¾àÀëÒ»¶¨±ÈµÚÒ»´Îµ½´ï´ó£¬ÀûÓÃÕâµã¾Í¿ÉÖªµÀÊÇ·ñÊǵÚÒ»´Î·ÃÎÊÁË¡£
´Ó¶ÓÁÐÖÐÈ¡³öµÚÒ»¸ö½Úµã£¬²¢¼ìÑéËüÊÇ·ñΪĿ±ê¡£
const visited = {}
function bfs() {
let q = new Queue()
q.push(³õʼ״̬)
while(q.length) {
let i = q.pop()
if (visited[i]) continue
for (iµÄ¿ÉµÖ´ï״̬j) {
if (j ºÏ·¨) {
q.push(j)
}
}
}
// ÕÒµ½ËùÓкϷ¨½â
}
https://leetcode-cn.com/probl...
°´×Öµä?wordList Íê³É´Óµ¥´Ê beginWord µ½µ¥´Ê endWord ת»¯£¬Ò»¸ö±íʾ´Ë¹ý³ÌµÄ ת»»ÐòÁÐ ÊÇÐÎʽÉÏÏñ beginWord -> s1 -> s2 -> ... -> sk ÕâÑùµÄµ¥´ÊÐòÁУ¬²¢Âú×㣺
ÿ¶ÔÏàÁڵĵ¥´ÊÖ®¼ä½öÓе¥¸ö×Öĸ²»Í¬¡£
ת»»¹ý³ÌÖеÄÿ¸öµ¥´Ê si£¨1 <= i <= k£©±ØÐëÊÇ×Öµä?wordList Öеĵ¥´Ê¡£×¢Ò⣬beginWord ²»±ØÊÇ×Öµä wordList Öеĵ¥´Ê¡£
sk == endWord
¸øÄãÁ½¸öµ¥´Ê beginWord ºÍ endWord £¬ÒÔ¼°Ò»¸ö×Öµä wordList ¡£ÇëÄãÕÒ³ö²¢·µ»ØËùÓÐ´Ó beginWord µ½ endWord µÄ ×î¶Ìת»»ÐòÁÐ £¬Èç¹û²»´æÔÚÕâÑùµÄת»»ÐòÁУ¬·µ»ØÒ»¸ö¿ÕÁÐ±í¡£Ã¿¸öÐòÁж¼Ó¦¸ÃÒÔµ¥´ÊÁбí [beginWord, s1, s2, ..., sk] µÄÐÎʽ·µ»Ø¡£
?
ʾÀý 1£º
ÊäÈ룺beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
Êä³ö£º[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]
½âÊÍ£º´æÔÚ 2 ÖÖ×î¶ÌµÄת»»ÐòÁУº
"hit" -> "hot" -> "dot" -> "dog" -> "cog"
"hit" -> "hot" -> "lot" -> "log" -> "cog"
ʾÀý 2£º
ÊäÈ룺beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
Êä³ö£º[]
½âÊÍ£ºendWord "cog" ²»ÔÚ×Öµä wordList ÖУ¬ËùÒÔ²»´æÔÚ·ûºÏÒªÇóµÄת»»ÐòÁС£
?
Ìáʾ£º
1 <= beginWord.length <= 7
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWord¡¢endWord ºÍ wordList[i] ÓÉСдӢÎÄ×Öĸ×é³É
beginWord != endWord
wordList ÖеÄËùÓе¥´Ê »¥²»Ïàͬ
ÕâµÀÌâ¾ÍÊÇÎÒÃÇÈÕ³£ÍæµÄ³ÉÓï½ÓÁúÓÎÏ·¡£¼´ÈÃÄã´Ó beginWord ¿ªÊ¼£¬ ½ÓÁúµÄ endWord¡£ÈÃÄãÕÒµ½×î¶ÌµÄ½ÓÁú·½Ê½£¬Èç¹ûÓжà¸ö£¬ÔòÈ«²¿·µ»Ø¡£
²»Í¬ÓÚ³ÉÓï½ÓÁúµÄ×ÖÊ×½Ó×Öβ¡£ÕâÖÖ½ÓÁúÐèÒªµÄÊÇÏÂÒ»¸öµ¥´ÊºÍÉÏÒ»¸öµ¥´Ê½öÓÐÒ»¸öµ¥´Ê²»Í¬¡£
ÎÒÃÇ¿ÉÒÔ¶ÔÎÊÌâ½øÐгéÏ󣺼´¹¹½¨Ò»¸ö´óСΪ n µÄͼ£¬Í¼ÖеÄÿһ¸öµã±íʾһ¸öµ¥´Ê£¬ÎÒÃǵÄÄ¿±êÊÇÕÒµ½Ò»Ìõ´Ó½Úµã beginWord µ½½Úµã endWord µÄÒ»Ìõ×î¶Ì·¾¶¡£
ÕâÊÇÒ»¸ö²»ÕÛ²»¿ÛµÄͼÉÏ BFS µÄÌâÄ¿¡£Ì×ÓÃÉÏÃæµÄ½âÌâÄ£°å¿ÉÒÔÇáËɽâ¾ö¡£Î¨Ò»ÐèҪעÒâµÄÊÇÈçºÎ¹¹½¨Í¼¡£¸ü½øÒ»²½Ëµ¾ÍÊÇÈçºÎ¹¹½¨±ß¡£
ÓÉÌâÄ¿ÐÅÏ¢µÄת»»¹æÔò£ºÃ¿¶ÔÏàÁڵĵ¥´ÊÖ®¼ä½öÓе¥¸ö×Öĸ²»Í¬¡£²»ÄÑÖªµÀ£¬Èç¹ûÁ½¸öµ¥´ÊµÄ½öÓе¥¸ö×Öĸ²»Í¬ £¬¾Í˵Ã÷Á½ÕßÖ®¼äÓÐÒ»Ìõ±ß¡£
Ã÷°×ÁËÕâÒ»µã£¬ÎÒÃǾͿÉÒÔ¹¹½¨ÁÚ½Ó¾ØÕóÁË¡£
ºËÐÄ´úÂ룺
neighbors = collections.defaultdict(list)
for word in wordList:
for i in range(len(word)):
neighbors[word[:i] + "*" + word[i + 1 :]].append(word)
¹¹½¨ºÃÁËͼ¡£ BFS Ê£ÏÂÒª×öµÄ¾ÍÊÇÃ÷È·ÆðµãºÍÖÕµã¾ÍºÃÁË¡£¶ÔÓÚÕâµÀÌâÀ´Ëµ£¬ÆðµãÊÇ beginWord£¬ÖÕµãÊÇ endWord¡£
ÄÇÎÒÃǾͿÉÒÔ½« beginWord Èë¶Ó¡£²»¶ÏÔÚͼÉÏ×ö BFS£¬Ö±µ½µÚÒ»´ÎÓöµ½ endWord ¾ÍºÃÁË¡£
Ì×ÓÃÉÏÃæµÄ BFS Ä£°å£¬²»ÄÑд³öÈçÏ´úÂë:
ÕâÀïÎÒÓÃÁË cost ¶ø²»ÊÇ visitd£¬Ä¿µÄÊÇΪÁËÈôó¼Ò¼ûʶ¶àÖÖд·¨¡£ÏÂÃæµÄÓÅ»¯½â·¨»áʹÓà visited À´¼Ç¼¡£
class Solution:
def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:
cost = collections.defaultdict(lambda: float("inf"))
cost[beginWord] = 0
neighbors = collections.defaultdict(list)
ans = []
for word in wordList:
for i in range(len(word)):
neighbors[word[:i] + "*" + word[i + 1 :]].append(word)
q = collections.deque([[beginWord]])
while q:
path = q.popleft()
cur = path[-1]
if cur == endWord:
ans.append(path.copy())
else:
for i in range(len(cur)):
for neighbor in neighbors[cur[:i] + "*" + cur[i + 1 :]]:
if cost[cur] + 1 <= cost[neighbor]:
q.append(path + [neighbor])
cost[neighbor] = cost[cur] + 1
return ans
µ±ÖÕµã¿ÉÒÔÄæÏòËÑË÷µÄʱºò£¬ÎÒÃÇÒ²¿ÉÒÔ³¢ÊÔË«Ïò BFS¡£¸ü±¾ÖÊÒ»µã¾ÍÊÇ£ºÈç¹ûÄã¹¹½¨µÄ״̬¿Õ¼äµÄ±ßÊÇË«ÏòµÄ£¬ÄÇô¾Í¿ÉÒÔʹÓÃË«Ïò BFS¡£
ºÍ DFS µÄË«ÏòËÑË÷˼ÏëÊÇÀàËƵġ£ÎÒÃÇÖ»ÐèҪʹÓÃÁ½¸ö¶ÓÁзֱð´æ´¢ÖÐÆðµãºÍÖÕµã½øÐÐÀ©Õ¹µÄ½Úµã£¨ÎÒ³ÆÆäΪÆðµã¼¯ÓëÖյ㼯£©¼´¿É¡£µ±ÆðµãºÍÖÕµãÔÚijһʱ¿Ì½»»ãÁË£¬ËµÃ÷ÕÒµ½ÁËÒ»¸ö´ÓÆðµãµ½ÖÕµãµÄ·¾¶£¬Æä·¾¶³¤¶È¾ÍÊÇÁ½¸ö¶ÓÁÐÀ©Õ¹µÄ·¾¶³¤¶ÈºÍ¡£
ÒÔÉϾÍÊÇË«ÏòËÑË÷µÄ´óÌå˼·¡£ÓÃͼÀ´±íʾ¾ÍÊÇÕâÑùµÄ£º
ÈçÉÏͼ£¬ÎÒÃÇ´ÓÆðµãºÍÖص㣨A ºÍ Z£©·Ö±ð¿ªÊ¼ËÑË÷£¬Èç¹ûÆðµãµÄÀ©Õ¹×´Ì¬ºÍÖÕµãµÄÀ©Õ¹×´Ì¬Öصþ£¨±¾ÖÊÉϾÍÊǶÓÁÐÖеÄÔªËØÖصþÁË£©£¬ÄÇôÎÒÃǾÍÖªµÀÁËÒ»¸ö´Ó½Úµãµ½ÖÕµãµÄ×î¶Ì·¾¶¡£
¶¯Í¼ÑÝʾ£º
¿´µ½ÕâÀïÓбØÒªÔÝͣһϲ弸¾ä»°¡£
Ϊʲô˫ÏòËÑË÷¾Í¿ìÁË£¿Ê²Ã´Çé¿ö¶¼»á¸ü¿ìô£¿ÄÇΪʲô²»¶¼ÓÃË«ÏòËÑË÷£¿ÓÐÄÄЩʹÓÃÌõ¼þ£¿
ÎÒÃÇÒ»¸ö¸ö»Ø´ð¡£
¿ÉÒÔ¿´³öËÑË÷Ê÷´óÁ˺ܶ࣬ÒÔÖÁÓںܶàµãÎÒ¶¼»²»Ï£¬Ö»ºÃÓà ¡±¡£¡£¡£¡° À´±íʾ¡£
ÈçͼʹÓõ¥ÏòËÑË÷»¹ÊÇË«ÏòËÑË÷¶¼ÊÇÒ»ÑùµÄ¡£
ÈÃÎÒÃǼÌÐø»Øµ½ÕâµÀÌ⡣ΪÁËÄܹ»ÅжÏÁ½ÕßÊÇ·ñ½»»ã£¬ÎÒÃÇ¿ÉÒÔʹÓÃÁ½¸ö hashSet ·Ö±ð´æ´¢Æðµã¼¯ºÏÖյ㼯¡£µ±Ò»¸ö½Úµã¼È³öÏÖÆðµã¼¯ÓÖ³öÏÖÔÚÖյ㼯£¬ÄǾÍ˵Ã÷³öÏÖÁ˽»»ã¡£
ΪÁ˽ÚÊ¡´úÂëÁ¿ÒÔ¼°¿Õ¼äÏûºÄ£¬ÎÒûÓÐʹÓÃÉÏÃæµÄ¶ÓÁУ¬¶øÊÇÖ±½ÓʹÓÃÁ˹þÏ£±íÀ´´úÌæ¶ÓÁС£ÕâÖÖ×ö·¨¿ÉÐеĹؼüÈÔÈ»ÊÇÉÏÃæÌáµ½µÄ¶ÓÁеĶþÖµÐԺ͵¥µ÷ÐÔ¡£
ÓÉÓÚÐÂÒ»Âֵijö¶ÓÁÐÇ°£¬¶ÓÁÐÖеÄȨֵ¶¼ÊÇÏàͬµÄ¡£Òò´Ë´Ó×óµ½ÓÒ±éÀú»òÕß´ÓÓÒµ½×ó±éÀú£¬ÉõÖÁÊÇÈÎÒâ˳Ðò±éÀú¶¼ÊÇÎÞËùνµÄ¡££¨ºÜ¶àÌⶼÎÞËùν£©Òò´ËʹÓùþÏ£±í¶ø²»ÊǶÓÁÐÒ²ÊÇ¿ÉÒԵġ£ÕâµãÐèÒªÒýÆð´ó¼ÒµÄ×¢Ò⡣ϣÍû´ó¼Ò¶Ô BFS µÄ±¾ÖÊÓиüÉîµÄÀí½â¡£
ÄÇÎÒÃÇÊDz»ÊDz»ÐèÒª¶ÓÁУ¬¾ÍÓùþÏ£±í£¬¹þÏ£¼¯ºÏɶµÄ´æ¾ÍÐÐÁË£¿·ÇÒ²£¡ÎÒ»áÔÚË«¶Ë¶ÓÁв¿·ÖΪ´ó¼Ò½ÒÏþ¡£
ÕâµÀÌâµÄ¾ßÌåËã·¨£º
Python3 Code:
class Solution:
def findLadders(self, beginWord: str, endWord: str, wordList: list) -> list:
# ¼ôÖ¦ 1
if endWord not in wordList: return []
ans = []
visited = set()
q1, q2 = {beginWord: [[beginWord]]}, {endWord: [[endWord]]}
steps = 0
# Ô¤´¦Àí£¬¿Õ¼ä»»Ê±¼ä
neighbors = collections.defaultdict(list)
for word in wordList:
for i in range(len(word)):
neighbors[word[:i] + "*" + word[i + 1 :]].append(word)
while q1:
# ¼ôÖ¦ 2
if len(q1) > len(q2):
q1, q2 = q2, q1
nxt = collections.defaultdict(list)
for _ in range(len(q1)):
word, paths = q1.popitem()
visited.add(word)
for i in range(len(word)):
for neighbor in neighbors[word[:i] + "*" + word[i + 1 :]]:
if neighbor in q2:
# ´Ó beginWord À©Õ¹¹ýÀ´µÄ
if paths[0][0] == beginWord:
ans += [path1 + path2[::-1] for path1 in paths for path2 in q2[neighbor]]
# ´Ó endWord À©Õ¹¹ýÀ´µÄ
else:
ans += [path2 + path1[::-1] for path1 in paths for path2 in q2[neighbor]]
if neighbor in wordList and neighbor not in visited:
nxt[neighbor] += [path + [neighbor] for path in paths]
steps += 1
# ¼ôÖ¦ 3
if ans and steps + 2 > len(ans[0]):
break
q1 = nxt
return ans
ÎÒÏëͨ¹ýÕâµÀÌâ¸ø´ó¼Ò´«µÝµÄ֪ʶµãºÜ¶à¡£·Ö±ðÊÇ£º
ÉÏÃæÌáµ½ÁË BFS ±¾ÖÊÉÏ¿ÉÒÔ¿´×öÊÇÔÚÒ»¸ö±ßȨֵΪ 1 µÄͼÉϽøÐбéÀú¡£Êµ¼ÊÉÏ£¬ÎÒÃÇ¿ÉÒÔ½øÐÐÒ»¸ö¼òµ¥µÄÀ©Õ¹¡£Èç¹ûͼÖбßȨֵ²»È«ÊÇ 1£¬¶øÊÇ 0 ºÍ 1 ÄØ£¿ÕâÑùÆäʵÎÒÃÇÓõ½Ë«¶Ë¶ÓÁС£
Ë«¶Ë¶ÓÁпÉÒÔÔÚÍ·²¿ºÍβ²¿Í¬Ê±½øÐвåÈëºÍɾ³ý£¬¶øÆÕͨµÄ¶ÓÁнöÔÊÐíÔÚÍ·²¿É¾³ý£¬ÔÚβ²¿²åÈë¡£
ʹÓÃË«¶Ë¶ÓÁУ¬µ±Ã¿´ÎÈ¡³öÒ»¸ö״̬µÄʱºò¡£Èç¹ûÎÒÃÇ¿ÉÒÔÎÞ´ú¼ÛµÄ½øÐÐתÒÆ£¬ÄÇô¾Í¿ÉÒÔ½«ÆäÖ±½Ó·ÅÔÚ¶ÓÍ·£¬·ñÔò·ÅÔÚ¶Óβ¡£ÓÉÇ°Ãæ½²µÄ¶ÓÁеĵ¥µ÷ÐԺͶþÖµÐÔ²»ÄѵóöËã·¨µÄÕýÈ·ÐÔ¡£¶øÈç¹û״̬תÒÆÊÇÓдú¼ÛµÄ£¬ÄÇô¾Í½«Æä·Åµ½¶Óβ¼´¿É¡£ÕâÒ²ÊǺܶàÓïÑÔÌṩµÄÄÚÖÃÊý¾Ý½á¹¹ÊÇË«¶Ë¶ÓÁУ¬¶ø²»ÊǶÓÁеÄÔÒòÖ®Ò»¡£
ÈçÏÂͼ£º
ÉÏÃæµÄ¶ÓÁÐÊÇÆÕͨµÄ¶ÓÁС£ ¶øÏÂÃæµÄË«¶Ë¶ÓÁУ¬¿ÉÒÔ¿´³öÎÒÃÇÔÚ¶ÓÍ·²å¶ÓÁËÒ»¸ö B¡£
¶¯Í¼ÑÝʾ£º
˼¿¼£ºÈç¹ûͼ¶ÔÓ¦µÄȨֵ²»³ö 0 ºÍ 1£¬¶øÊÇÈÎÒâÕýÕûÊýÄØ£¿
Ç°ÃæÎÒÃÇÌáµ½ÁËÊDz»ÊDz»ÐèÒª¶ÓÁУ¬¾ÍÓùþÏ£±í£¬¹þÏ£¼¯ºÏɶµÄ´æ¾ÍÐÐÁË£¿ ÕâÀïΪ´ó¼Ò½ÒÃØ¡£²»¿ÉÒԵġ£ÒòΪ¹þÏ£±íÎÞ·¨´¦ÀíÕâÀïµÄȨֵΪ 0 µÄÇé¿ö¡£
BFS ºÍ DFS ·Ö±ð´¦ÀíʲôÑùµÄÎÊÌ⣿Á½Õß¾¿¾¹ÓÐʲôÑùµÄÇø±ð£¿ÕâЩ¶¼ÖµµÃÎÒÃÇÈÏÕæÑо¿¡£
¼òµ¥À´Ëµ£¬²»¹ÜÊÇ DFS »¹ÊÇ BFS ¶¼ÊǶÔÌâÄ¿¶ÔÓ¦µÄ״̬¿Õ¼ä½øÐÐËÑË÷¡£
¾ßÌåÀ´Ëµ£¬¶þÕßÇø±ðÔÚÓÚ£º
ÈçÏÂͼ£¬ÎÒÃDZéÀúµ½ A£¬ÓÐÈý¸öÑ¡Ôñ¡£´ËʱÎÒÃÇ¿ÉÒÔÈÎÒâÑ¡ÔñÒ»Ìõ£¬±ÈÈçÑ¡ÔñÁË B£¬³ÌÐò»á¼ÌÐøÍùϽøÐÐÑ¡Ôñ·ÖÖ§ 2£¬3 ¡£¡£¡£
Èç϶¯Í¼ÑÝʾÁËÒ»¸öµäÐ굀 DFS Á÷³Ì¡£ºóÃæµÄÕ½ڣ¬ÎÒÃÇ»á¸ø´ó¼Ò´øÀ´¸ü¸´ÔÓµÄͼÉÏ DFS¡£
ÈçÏÂͼ£¬¹ã¶ÈÓÅÏȱéÀú»á½«ËÑË÷µÄÑ¡ÔñÈ«²¿Ñ¡ÔñÒ»±é»á²Å»á½øÈëµ½ÏÂÒ»²ã¡£ºÍÉÏÃæÒ»Ñù£¬ÎÒ¸ø´ó¼Ò±ê×¢Á˳ÌÐòÖ´ÐеÄÒ»ÖÖ¿ÉÄܵÄ˳Ðò¡£
¿ÉÒÔ·¢ÏÖ£¬ºÍÎÒÉÏÃæ˵µÄÒ»Ñù¡£ÓÒ²àµÄ¶ÓÁÐʼÖÕ×î¶àÓÐÁ½²ãµÄ½Úµã£¬²¢ÇÒÏàͬ²ãµÄ×ÜÔÚÒ»Æ𣬻»¾ä»°Ëµ¶ÓÁеÄÔªËØÔÚ²ãÉÏÂú×ãµ¥µ÷ÐÔ¡£
Èç϶¯Í¼ÑÝʾÁËÒ»¸öµäÐ굀 BFS Á÷³Ì¡£ºóÃæµÄÕ½ڣ¬ÎÒÃÇ»á¸ø´ó¼Ò´øÀ´¸ü¸´ÔÓµÄͼÉÏ BFS¡£
ÒÔÉϾÍÊÇ¡¶ËÑË÷ƪ£¨ÉÏ£©¡·µÄËùÓÐÄÚÈÝÁË¡£×ܽáÒ»ÏÂËÑË÷ƪµÄ½âÌâ˼·£º
ÎÒÃÇ»¨ÁË´óÁ¿µÄƪ·ù¶Ô BFS ºÍ DFS ½øÐÐÁËÏêϸµÄ½²½â£¬°üÀ¨Á½¸öµÄ¶Ô±È¡£
ºËÐĵãÐèÒª´ó¼Ò×¢Ò⣺
Ë«ÏòËÑË÷µÄ±¾ÖÊÊǽ«¸´ÔӶȵij£ÊýÏî´ÓÒ»¸öÓ°Ïì½Ï´óµÄλÖ㨱ÈÈçÖ¸Êý룩ÒƵ½ÁËÓ°Ïì½ÏСµÄλÖ㨱ÈÈçϵÊý룩¡£
ËÑË÷ƪ֪ʶµã±È½ÏÃܼ¯£¬Ï£Íû´ó¼Ò¶à¶à×ܽḴϰ¡£
ÏÂÒ»½Ú£¬ÎÒÃǽéÉÜ£º
³£ÓõÄÖ¸±êÓëͳ¼Æ·½·¨¡£¾ßÌå°üÀ¨£º
ϽÚÄÚÈÝ»áÊ×·¢ÔÚ¡¶91 ÌìѧËã·¨¡·¡£Ïë²Î¼ÓµÄ¿ÉÒÔ´ÁÕâÀïÁ˽âÏêÇ飺https://lucifer.ren/blog/2021...
ÐèÇóÃèÊö ½Óµ½µÄÔʼÐèÇóÊÇÕâÑùµÄ£¬ÓÐÒ»¸öH5Ò³Ã棬ҳÃæÖÐÓиöµã»÷ÏÂÔصİ´Å¥£¬µã...
±¾ÎÄÀ´×Ô Tom Ewer µÄManagewp blog׫ÎÄ£¬±í´ïÁËÆä¶ÔʱÏ·çÃÒµÄÏìӦʽÉè¼Æ²»Ò»Ñù...
¸÷λ²ÎÈüÑ¡ÊÖ£º 2020 ÌÚѶ Light.¹«Òæ´´ÐÂÌôÕ½Èü×Ô±¨Ãû¿ªÆôÒÔÀ´£¬·´ÏìÈÈÁÒ£¬Òò²Î...
Previously Ç°Á½ÆªÎÄÕ£¨ »º´æÎȶ¨ÐÔ ºÍ »º´æÕýÈ·ÐÔ £©¸ú´ó¼ÒÌÖÂÛÁË»º´æµÄ¡ºÎȶ¨...
×÷ÓãºÌøתµ½ÉÏÒ»¸öÒ³Ãæ»òÏÂÒ»¸öÒ³Ãæ¡£ ÔªËØ£º·ÖÒ³µÄ»ù±¾ÔªËØÓУºÉÏÒ³+Ò³Âë+ÏÂÒ³...
-9999 pxµÄÐÎÏóÌæ´ú¼¼ÊõÒѾÁ÷ÐÐÁËÒ»¸öÊ®Äê×îºÃµÄ²¿·Ö¡£Ìæ»»Ò»¸öÎı¾ÔªËغÍÒ»¸ö...
Ç°ÑÔ ±ÊÕß×î½üдÁ˱¾¹ØÓÚ¿ÉÊÓ»¯´î½¨·½ÏòµÄ¾ò½øС²á£¬Ö±½Ó·ÅÁ´½Ó£º https://jueji...
±¾ÎÄÖ÷Òª½²½âµÄÊDZí¸ñ£¬Õâ¸öÆäʵ¶ÔÓÚ×ö¹ýÍøÕ¾µÄÈËÀ´Ëµ£¬²¢²»Ä°Éú£¬¶øÇÒ¿ÉÒÔ˵ÊÇ...
ǰЩÈÕ×Ó£¬Ç°±²ÍƼöÁËÒ»¸öÓÐȤµÄÏîÄ¿ Real-Time-Person-Removal £¬Õâ¸öÏîĿʹÓÃ...
×÷Õß / Oscar Wahltinez, Developer Relations Engineer, Google Óû§ÃÇÕýÔÚ¿´µ½...