2024-05-01 06:47:42 +08:00
<!doctype html>
< html lang = "en" class = "no-js" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width,initial-scale=1" >
< meta name = "description" content = "Data Structures and Algorithms Crash Course with Animated Illustrations and Off-the-Shelf Code" >
< meta name = "author" content = "krahets" >
< link rel = "canonical" href = "https://www.hello-algo.com/en/chapter_greedy/greedy_algorithm/" >
< link rel = "prev" href = "../" >
< link rel = "next" href = "../fractional_knapsack_problem/" >
< link rel = "icon" href = "../../assets/images/favicon.png" >
< meta name = "generator" content = "mkdocs-1.5.3, mkdocs-material-9.5.5" >
< title > 15.1 Greedy algorithms - Hello Algo< / title >
< link rel = "stylesheet" href = "../../assets/stylesheets/main.50c56a3b.min.css" >
< link rel = "stylesheet" href = "../../assets/stylesheets/palette.06af60db.min.css" >
< link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin >
< link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback" >
< style > : root { --md-text-font : "Roboto" ; --md-code-font : "Roboto Mono" } < / style >
< link rel = "stylesheet" href = "../../stylesheets/extra.css" >
< script > _ _md _scope = new URL ( "../.." , location ) , _ _md _hash = e => [ ... e ] . reduce ( ( e , _ ) => ( e << 5 ) - e + _ . charCodeAt ( 0 ) , 0 ) , _ _md _get = ( e , _ = localStorage , t = _ _md _scope ) => JSON . parse ( _ . getItem ( t . pathname + "." + e ) ) , _ _md _set = ( e , _ , t = localStorage , a = _ _md _scope ) => { try { t . setItem ( a . pathname + "." + e , JSON . stringify ( _ ) ) } catch ( e ) { } } < / script >
< link href = "../../assets/stylesheets/glightbox.min.css" rel = "stylesheet" / > < style >
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: white; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);}
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);}
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}
< / style > < script src = "../../assets/javascripts/glightbox.min.js" > < / script > < / head >
< body dir = "ltr" data-md-color-scheme = "default" data-md-color-primary = "white" data-md-color-accent = "teal" >
< input class = "md-toggle" data-md-toggle = "drawer" type = "checkbox" id = "__drawer" autocomplete = "off" >
< input class = "md-toggle" data-md-toggle = "search" type = "checkbox" id = "__search" autocomplete = "off" >
< label class = "md-overlay" for = "__drawer" > < / label >
< div data-md-component = "skip" >
< a href = "#151-greedy-algorithms" class = "md-skip" >
Skip to content
< / a >
< / div >
< div data-md-component = "announce" >
< aside class = "md-banner" >
< div class = "md-banner__inner md-grid md-typeset" >
< button class = "md-banner__button md-icon" aria-label = "Don't show this again" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z" / > < / svg >
< / button >
< div class = "banner-svg" >
< svg xmlns = "http://www.w3.org/2000/svg"
viewBox="0 0 512 512"><!-- !Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc. -->
< path
d="M480 32c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9L381.7 53c-48 48-113.1 75-181 75H192 160 64c-35.3 0-64 28.7-64 64v96c0 35.3 28.7 64 64 64l0 128c0 17.7 14.3 32 32 32h64c17.7 0 32-14.3 32-32V352l8.7 0c67.9 0 133 27 181 75l43.6 43.6c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6V300.4c18.6-8.8 32-32.5 32-60.4s-13.4-51.6-32-60.4V32zm-64 76.7V240 371.3C357.2 317.8 280.5 288 200.7 288H192V192h8.7c79.8 0 156.5-29.8 215.3-83.3z" />
< / svg >
< span > Welcome to contribute to Chinese-to-English translation! Please visit < a href = "https://github.com/krahets/hello-algo/issues/914" > #914< / a > for more details.< / span >
< / div >
< / div >
< script > var content , el = document . querySelector ( "[data-md-component=announce]" ) ; el && ( content = el . querySelector ( ".md-typeset" ) , _ _md _hash ( content . innerHTML ) === _ _md _get ( "__announce" ) && ( el . hidden = ! 0 ) ) < / script >
< / aside >
< / div >
< header class = "md-header md-header--shadow" data-md-component = "header" >
< nav class = "md-header__inner md-grid" aria-label = "Header" >
< a href = "../.." title = "Hello Algo" class = "md-header__button md-logo" aria-label = "Hello Algo" data-md-component = "logo" >
< img src = "../../assets/images/logo.svg" alt = "logo" >
< / a >
< label class = "md-header__button md-icon" for = "__drawer" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z" / > < / svg >
< / label >
< div class = "md-header__title" data-md-component = "header-title" >
< div class = "md-header__ellipsis" >
< div class = "md-header__topic" >
< span class = "md-ellipsis" >
Hello Algo
< / span >
< / div >
< div class = "md-header__topic" data-md-component = "header-topic" >
< span class = "md-ellipsis" >
15.1 Greedy algorithms
< / span >
< / div >
< / div >
< / div >
< form class = "md-header__option" data-md-component = "palette" >
< input class = "md-option" data-md-color-media = "" data-md-color-scheme = "default" data-md-color-primary = "white" data-md-color-accent = "teal" aria-label = "Dark mode" type = "radio" name = "__palette" id = "__palette_0" >
< label class = "md-header__button md-icon" title = "Dark mode" for = "__palette_1" hidden >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M7.5 2c-1.79 1.15-3 3.18-3 5.5s1.21 4.35 3.03 5.5C4.46 13 2 10.54 2 7.5A5.5 5.5 0 0 1 7.5 2m11.57 1.5 1.43 1.43L4.93 20.5 3.5 19.07 19.07 3.5m-6.18 2.43L11.41 5 9.97 6l.42-1.7L9 3.24l1.75-.12.58-1.65L12 3.1l1.73.03-1.35 1.13.51 1.67m-3.3 3.61-1.16-.73-1.12.78.34-1.32-1.09-.83 1.36-.09.45-1.29.51 1.27 1.36.03-1.05.87.4 1.31M19 13.5a5.5 5.5 0 0 1-5.5 5.5c-1.22 0-2.35-.4-3.26-1.07l7.69-7.69c.67.91 1.07 2.04 1.07 3.26m-4.4 6.58 2.77-1.15-.24 3.35-2.53-2.2m4.33-2.7 1.15-2.77 2.2 2.54-3.35.23m1.15-4.96-1.14-2.78 3.34.24-2.2 2.54M9.63 18.93l2.77 1.15-2.53 2.19-.24-3.34Z" / > < / svg >
< / label >
< input class = "md-option" data-md-color-media = "" data-md-color-scheme = "slate" data-md-color-primary = "black" data-md-color-accent = "teal" aria-label = "Light mode" type = "radio" name = "__palette" id = "__palette_1" >
< label class = "md-header__button md-icon" title = "Light mode" for = "__palette_0" hidden >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M7.5 2c-1.79 1.15-3 3.18-3 5.5s1.21 4.35 3.03 5.5C4.46 13 2 10.54 2 7.5A5.5 5.5 0 0 1 7.5 2m11.57 1.5 1.43 1.43L4.93 20.5 3.5 19.07 19.07 3.5m-6.18 2.43L11.41 5 9.97 6l.42-1.7L9 3.24l1.75-.12.58-1.65L12 3.1l1.73.03-1.35 1.13.51 1.67m-3.3 3.61-1.16-.73-1.12.78.34-1.32-1.09-.83 1.36-.09.45-1.29.51 1.27 1.36.03-1.05.87.4 1.31M19 13.5a5.5 5.5 0 0 1-5.5 5.5c-1.22 0-2.35-.4-3.26-1.07l7.69-7.69c.67.91 1.07 2.04 1.07 3.26m-4.4 6.58 2.77-1.15-.24 3.35-2.53-2.2m4.33-2.7 1.15-2.77 2.2 2.54-3.35.23m1.15-4.96-1.14-2.78 3.34.24-2.2 2.54M9.63 18.93l2.77 1.15-2.53 2.19-.24-3.34Z" / > < / svg >
< / label >
< / form >
< script > var media , input , key , value , palette = _ _md _get ( "__palette" ) ; if ( palette && palette . color ) { "(prefers-color-scheme)" === palette . color . media && ( media = matchMedia ( "(prefers-color-scheme: light)" ) , input = document . querySelector ( media . matches ? "[data-md-color-media='(prefers-color-scheme: light)']" : "[data-md-color-media='(prefers-color-scheme: dark)']" ) , palette . color . media = input . getAttribute ( "data-md-color-media" ) , palette . color . scheme = input . getAttribute ( "data-md-color-scheme" ) , palette . color . primary = input . getAttribute ( "data-md-color-primary" ) , palette . color . accent = input . getAttribute ( "data-md-color-accent" ) ) ; for ( [ key , value ] of Object . entries ( palette . color ) ) document . body . setAttribute ( "data-md-color-" + key , value ) } < / script >
< div class = "md-header__option" >
< div class = "md-select" >
< button class = "md-header__button md-icon" aria-label = "Select language" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z" / > < / svg >
< / button >
< div class = "md-select__inner" >
< ul class = "md-select__list" >
< li class = "md-select__item" >
2024-05-01 19:57:53 +08:00
< a href = "/chapter_greedy/greedy_algorithm/" hreflang = "zh" class = "md-select__link" >
2024-05-01 06:47:42 +08:00
简体中文
< / a >
< / li >
< li class = "md-select__item" >
2024-05-01 19:57:53 +08:00
< a href = "/zh-hant/chapter_greedy/greedy_algorithm/" hreflang = "zh-Hant" class = "md-select__link" >
2024-05-01 06:47:42 +08:00
繁體中文
< / a >
< / li >
< li class = "md-select__item" >
2024-05-01 19:57:53 +08:00
< a href = "/en/chapter_greedy/greedy_algorithm/" hreflang = "en" class = "md-select__link" >
2024-05-01 06:47:42 +08:00
English
< / a >
< / li >
< / ul >
< / div >
< / div >
< / div >
< label class = "md-header__button md-icon" for = "__search" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z" / > < / svg >
< / label >
< div class = "md-search" data-md-component = "search" role = "dialog" >
< label class = "md-search__overlay" for = "__search" > < / label >
< div class = "md-search__inner" role = "search" >
< form class = "md-search__form" name = "search" >
< input type = "text" class = "md-search__input" name = "query" aria-label = "Search" placeholder = "Search" autocapitalize = "off" autocorrect = "off" autocomplete = "off" spellcheck = "false" data-md-component = "search-query" required >
< label class = "md-search__icon md-icon" for = "__search" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z" / > < / svg >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z" / > < / svg >
< / label >
< nav class = "md-search__options" aria-label = "Search" >
< a href = "javascript:void(0)" class = "md-search__icon md-icon" title = "Share" aria-label = "Share" data-clipboard data-clipboard-text = "" data-md-component = "search-share" tabindex = "-1" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z" / > < / svg >
< / a >
< button type = "reset" class = "md-search__icon md-icon" title = "Clear" aria-label = "Clear" tabindex = "-1" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z" / > < / svg >
< / button >
< / nav >
< div class = "md-search__suggest" data-md-component = "search-suggest" > < / div >
< / form >
< div class = "md-search__output" >
< div class = "md-search__scrollwrap" data-md-scrollfix >
< div class = "md-search-result" data-md-component = "search-result" >
< div class = "md-search-result__meta" >
Initializing search
< / div >
< ol class = "md-search-result__list" role = "presentation" > < / ol >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "md-header__source" >
< a href = "https://github.com/krahets/hello-algo" title = "Go to repository" class = "md-source" data-md-component = "source" >
< div class = "md-source__icon md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 496 512" > <!-- ! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z" / > < / svg >
< / div >
< div class = "md-source__repository" >
krahets/hello-algo
< / div >
< / a >
< / div >
< / nav >
< / header >
< div class = "md-container" data-md-component = "container" >
< main class = "md-main" data-md-component = "main" >
< div class = "md-main__inner md-grid" >
< div class = "md-sidebar md-sidebar--primary" data-md-component = "sidebar" data-md-type = "navigation" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav class = "md-nav md-nav--primary" aria-label = "Navigation" data-md-level = "0" >
< label class = "md-nav__title" for = "__drawer" >
< a href = "../.." title = "Hello Algo" class = "md-nav__button md-logo" aria-label = "Hello Algo" data-md-component = "logo" >
< img src = "../../assets/images/logo.svg" alt = "logo" >
< / a >
Hello Algo
< / label >
< div class = "md-nav__source" >
< a href = "https://github.com/krahets/hello-algo" title = "Go to repository" class = "md-source" data-md-component = "source" >
< div class = "md-source__icon md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 496 512" > <!-- ! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z" / > < / svg >
< / div >
< div class = "md-source__repository" >
krahets/hello-algo
< / div >
< / a >
< / div >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_1" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_hello_algo/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "m13.13 22.19-1.63-3.83c1.57-.58 3.04-1.36 4.4-2.27l-2.77 6.1M5.64 12.5l-3.83-1.63 6.1-2.77C7 9.46 6.22 10.93 5.64 12.5M19.22 4c.28 0 .53 0 .74.05.17 1.39-.02 4.25-3.3 7.53-1.7 1.71-3.73 3.02-6.01 3.89l-2.15-2.1c.92-2.31 2.23-4.34 3.92-6.03C15.18 4.58 17.64 4 19.22 4m0-2c-1.98 0-4.98.69-8.22 3.93-2.19 2.19-3.5 4.6-4.35 6.71-.28.75-.09 1.57.46 2.13l2.13 2.12c.38.38.89.61 1.42.61.23 0 .47-.06.7-.15A19.1 19.1 0 0 0 18.07 13c5.66-5.66 3.54-10.61 3.54-10.61S20.7 2 19.22 2m-4.68 7.46c-.78-.78-.78-2.05 0-2.83s2.05-.78 2.83 0c.77.78.78 2.05 0 2.83-.78.78-2.05.78-2.83 0m-5.66 7.07-1.41-1.41 1.41 1.41M6.24 22l3.64-3.64c-.34-.09-.67-.24-.97-.45L4.83 22h1.41M2 22h1.41l4.77-4.76-1.42-1.41L2 20.59V22m0-2.83 4.09-4.08c-.21-.3-.36-.62-.45-.97L2 17.76v1.41Z" / > < / svg >
< span class = "md-ellipsis" >
Before starting
< / span >
< / a >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_1_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_1" >
< span class = "md-nav__icon md-icon" > < / span >
Before starting
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_2" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_preface/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M21 4H3a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M3 19V6h8v13H3m18 0h-8V6h8v13m-7-9.5h6V11h-6V9.5m0 2.5h6v1.5h-6V12m0 2.5h6V16h-6v-1.5Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 0. Preface
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_2" id = "__nav_2_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_2_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_2" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 0. Preface
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_preface/about_the_book/" class = "md-nav__link" >
< span class = "md-ellipsis" >
0.1 About this book
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_preface/suggestions/" class = "md-nav__link" >
< span class = "md-ellipsis" >
0.2 How to read
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_preface/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
0.3 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_3" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_introduction/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m0 16H5V5h14v14M6.2 7.7h5v1.5h-5V7.7m6.8 8.1h5v1.5h-5v-1.5m0-2.6h5v1.5h-5v-1.5M8 18h1.5v-2h2v-1.5h-2v-2H8v2H6V16h2v2m6.1-7.1 1.4-1.4 1.4 1.4 1.1-1-1.4-1.4L18 7.1 16.9 6l-1.4 1.4L14.1 6 13 7.1l1.4 1.4L13 9.9l1.1 1Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 1. Encounter with algorithms
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_3" id = "__nav_3_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_3_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_3" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 1. Encounter with algorithms
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_introduction/algorithms_are_everywhere/" class = "md-nav__link" >
< span class = "md-ellipsis" >
1.1 Algorithms are everywhere
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_introduction/what_is_dsa/" class = "md-nav__link" >
< span class = "md-ellipsis" >
1.2 What is an algorithm
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_introduction/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
1.3 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_4" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_computational_complexity/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M6 2h12v6l-4 4 4 4v6H6v-6l4-4-4-4V2m10 14.5-4-4-4 4V20h8v-3.5m-4-5 4-4V4H8v3.5l4 4M10 6h4v.75l-2 2-2-2V6Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 2. Complexity analysis
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_4" id = "__nav_4_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_4_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_4" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 2. Complexity analysis
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_computational_complexity/performance_evaluation/" class = "md-nav__link" >
< span class = "md-ellipsis" >
2.1 Algorithm efficiency assessment
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_computational_complexity/iteration_and_recursion/" class = "md-nav__link" >
< span class = "md-ellipsis" >
2.2 Iteration and recursion
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_computational_complexity/time_complexity/" class = "md-nav__link" >
< span class = "md-ellipsis" >
2.3 Time complexity
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_computational_complexity/space_complexity/" class = "md-nav__link" >
< span class = "md-ellipsis" >
2.4 Space complexity
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_computational_complexity/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
2.5 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_5" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_data_structure/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M11 13.5v8H3v-8h8m-2 2H5v4h4v-4M12 2l5.5 9h-11L12 2m0 3.86L10.08 9h3.84L12 5.86M17.5 13c2.5 0 4.5 2 4.5 4.5S20 22 17.5 22 13 20 13 17.5s2-4.5 4.5-4.5m0 2a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-2.5-2.5Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 3. Data structures
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_5" id = "__nav_5_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_5_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_5" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 3. Data structures
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_data_structure/classification_of_data_structure/" class = "md-nav__link" >
< span class = "md-ellipsis" >
3.1 Classification of data structures
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_data_structure/basic_data_types/" class = "md-nav__link" >
< span class = "md-ellipsis" >
3.2 Basic data types
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_data_structure/number_encoding/" class = "md-nav__link" >
< span class = "md-ellipsis" >
3.3 Number encoding *
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_data_structure/character_encoding/" class = "md-nav__link" >
< span class = "md-ellipsis" >
3.4 Character encoding *
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_data_structure/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
3.5 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_6" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_array_and_linkedlist/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M3 5v14h17V5H3m4 2v2H5V7h2m-2 6v-2h2v2H5m0 2h2v2H5v-2m13 2H9v-2h9v2m0-4H9v-2h9v2m0-4H9V7h9v2Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 4. Array and linked list
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_6" id = "__nav_6_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_6_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_6" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 4. Array and linked list
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_array_and_linkedlist/array/" class = "md-nav__link" >
< span class = "md-ellipsis" >
4.1 Array
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_array_and_linkedlist/linked_list/" class = "md-nav__link" >
< span class = "md-ellipsis" >
4.2 Linked list
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_array_and_linkedlist/list/" class = "md-nav__link" >
< span class = "md-ellipsis" >
4.3 List
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_array_and_linkedlist/ram_and_cache/" class = "md-nav__link" >
< span class = "md-ellipsis" >
4.4 Memory and cache *
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_array_and_linkedlist/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
4.5 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_7" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_stack_and_queue/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M17.36 20.2v-5.38h1.79V22H3v-7.18h1.8v5.38h12.56M6.77 14.32l.37-1.76 8.79 1.85-.37 1.76-8.79-1.85m1.16-4.21.76-1.61 8.14 3.78-.76 1.62-8.14-3.79m2.26-3.99 1.15-1.38 6.9 5.76-1.15 1.37-6.9-5.75m4.45-4.25L20 9.08l-1.44 1.07-5.36-7.21 1.44-1.07M6.59 18.41v-1.8h8.98v1.8H6.59Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 5. Stack and queue
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_7" id = "__nav_7_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_7_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_7" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 5. Stack and queue
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_stack_and_queue/stack/" class = "md-nav__link" >
< span class = "md-ellipsis" >
5.1 Stack
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_stack_and_queue/queue/" class = "md-nav__link" >
< span class = "md-ellipsis" >
5.2 Queue
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_stack_and_queue/deque/" class = "md-nav__link" >
< span class = "md-ellipsis" >
5.3 Double-ended queue
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_stack_and_queue/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
5.4 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_8" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_hashing/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M19.3 17.89c1.32-2.1.7-4.89-1.41-6.21a4.52 4.52 0 0 0-6.21 1.41C10.36 15.2 11 18 13.09 19.3c1.47.92 3.33.92 4.8 0L21 22.39 22.39 21l-3.09-3.11m-2-.62c-.98.98-2.56.97-3.54 0-.97-.98-.97-2.56.01-3.54.97-.97 2.55-.97 3.53 0 .96.99.95 2.57-.03 3.54h.03M19 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.81a6.3 6.3 0 0 1-1.31-2H5v-4h4.18c.16-.71.43-1.39.82-2H5V8h6v2.81a6.3 6.3 0 0 1 2-1.31V8h6v2a6.499 6.499 0 0 1 2 2V6a2 2 0 0 0-2-2Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 6. Hash table
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_8" id = "__nav_8_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_8_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_8" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 6. Hash table
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_hashing/hash_map/" class = "md-nav__link" >
< span class = "md-ellipsis" >
6.1 Hash table
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_hashing/hash_collision/" class = "md-nav__link" >
< span class = "md-ellipsis" >
6.2 Hash collision
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_hashing/hash_algorithm/" class = "md-nav__link" >
< span class = "md-ellipsis" >
6.3 Hash algorithm
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_hashing/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
6.4 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_9" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_tree/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M19.5 17c-.14 0-.26 0-.39.04L17.5 13.8c.45-.45.75-1.09.75-1.8a2.5 2.5 0 0 0-2.5-2.5c-.14 0-.25 0-.4.04L13.74 6.3c.47-.46.76-1.09.76-1.8a2.5 2.5 0 0 0-5 0c0 .7.29 1.34.76 1.79L8.65 9.54c-.15-.04-.26-.04-.4-.04a2.5 2.5 0 0 0-2.5 2.5c0 .71.29 1.34.75 1.79l-1.61 3.25C4.76 17 4.64 17 4.5 17a2.5 2.5 0 0 0 0 5A2.5 2.5 0 0 0 7 19.5c0-.7-.29-1.34-.76-1.79l1.62-3.25c.14.04.26.04.39.04s.25 0 .38-.04l1.63 3.25c-.47.45-.76 1.09-.76 1.79a2.5 2.5 0 0 0 5 0A2.5 2.5 0 0 0 12 17c-.13 0-.26 0-.39.04L10 13.8c.45-.45.75-1.09.75-1.8 0-.7-.29-1.33-.75-1.79l1.61-3.25c.13.04.26.04.39.04s.26 0 .39-.04L14 10.21a2.5 2.5 0 0 0 1.75 4.29c.13 0 .25 0 .38-.04l1.63 3.25c-.47.45-.76 1.09-.76 1.79a2.5 2.5 0 0 0 5 0 2.5 2.5 0 0 0-2.5-2.5m-15 3.5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1m8.5-1c0 .55-.45 1-1 1s-1-.45-1-1 .45-1 1-1 1 .45 1 1M7.25 12c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1M11 4.5c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1m3.75 7.5c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1m4.75 8.5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 7. Tree
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_9" id = "__nav_9_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_9_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_9" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 7. Tree
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_tree/binary_tree/" class = "md-nav__link" >
< span class = "md-ellipsis" >
7.1 Binary tree
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_tree/binary_tree_traversal/" class = "md-nav__link" >
< span class = "md-ellipsis" >
7.2 Binary tree traversal
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_tree/array_representation_of_tree/" class = "md-nav__link" >
< span class = "md-ellipsis" >
7.3 Array Representation of tree
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_tree/binary_search_tree/" class = "md-nav__link" >
< span class = "md-ellipsis" >
7.4 Binary Search tree
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_tree/avl_tree/" class = "md-nav__link" >
< span class = "md-ellipsis" >
7.5 AVL tree *
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_tree/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
7.6 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_10" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_heap/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M12 1a2.5 2.5 0 0 0-2.5 2.5A2.5 2.5 0 0 0 11 5.79V7H7a2 2 0 0 0-2 2v.71A2.5 2.5 0 0 0 3.5 12 2.5 2.5 0 0 0 5 14.29V15H4a2 2 0 0 0-2 2v1.21A2.5 2.5 0 0 0 .5 20.5 2.5 2.5 0 0 0 3 23a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 4 18.21V17h4v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 9 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17a2 2 0 0 0-2-2H7v-.71A2.5 2.5 0 0 0 8.5 12 2.5 2.5 0 0 0 7 9.71V9h10v.71A2.5 2.5 0 0 0 15.5 12a2.5 2.5 0 0 0 1.5 2.29V15h-1a2 2 0 0 0-2 2v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 15 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17h4v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 21 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17a2 2 0 0 0-2-2h-1v-.71A2.5 2.5 0 0 0 20.5 12 2.5 2.5 0 0 0 19 9.71V9a2 2 0 0 0-2-2h-4V5.79a2.5 2.5 0 0 0 1.5-2.29A2.5 2.5 0 0 0 12 1m0 1.5a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1M6 11a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m12 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1M3 19.5a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 8. Heap
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_10" id = "__nav_10_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_10_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_10" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 8. Heap
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_heap/heap/" class = "md-nav__link" >
< span class = "md-ellipsis" >
8.1 Heap
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_heap/build_heap/" class = "md-nav__link" >
< span class = "md-ellipsis" >
8.2 Building a heap
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_heap/top_k/" class = "md-nav__link" >
< span class = "md-ellipsis" >
8.3 Top-k problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_heap/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
8.4 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_11" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_graph/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "m12 5.37-.44-.06L6 14.9c.24.21.4.48.47.78h11.06c.07-.3.23-.57.47-.78l-5.56-9.59-.44.06M6.6 16.53l4.28 2.53c.29-.27.69-.43 1.12-.43.43 0 .83.16 1.12.43l4.28-2.53H6.6M12 22a1.68 1.68 0 0 1-1.68-1.68l.09-.56-4.3-2.55c-.31.36-.76.58-1.27.58a1.68 1.68 0 0 1-1.68-1.68c0-.79.53-1.45 1.26-1.64V9.36c-.83-.11-1.47-.82-1.47-1.68A1.68 1.68 0 0 1 4.63 6c.55 0 1.03.26 1.34.66l4.41-2.53-.06-.45c0-.93.75-1.68 1.68-1.68.93 0 1.68.75 1.68 1.68l-.06.45 4.41 2.53c.31-.4.79-.66 1.34-.66a1.68 1.68 0 0 1 1.68 1.68c0 .86-.64 1.57-1.47 1.68v5.11c.73.19 1.26.85 1.26 1.64a1.68 1.68 0 0 1-1.68 1.68c-.51 0-.96-.22-1.27-.58l-4.3 2.55.09.56A1.68 1.68 0 0 1 12 22M10.8 4.86 6.3 7.44l.02.24c0 .71-.44 1.32-1.06 1.57l.03 5.25 5.51-9.64m2.4 0 5.51 9.64.03-5.25c-.62-.25-1.06-.86-1.06-1.57l.02-.24-4.5-2.58Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 9. Graph
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_11" id = "__nav_11_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_11_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_11" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 9. Graph
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_graph/graph/" class = "md-nav__link" >
< span class = "md-ellipsis" >
9.1 Graph
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_graph/graph_operations/" class = "md-nav__link" >
< span class = "md-ellipsis" >
9.2 Basic graph operations
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_graph/graph_traversal/" class = "md-nav__link" >
< span class = "md-ellipsis" >
9.3 Graph traversal
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_graph/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
9.4 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_12" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_searching/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "m19.31 18.9 3.08 3.1L21 23.39l-3.12-3.07c-.69.43-1.51.68-2.38.68-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5c0 .88-.25 1.71-.69 2.4m-3.81.1a2.5 2.5 0 0 0 0-5 2.5 2.5 0 0 0 0 5M21 4v2H3V4h18M3 16v-2h6v2H3m0-5V9h18v2h-2.03c-1.01-.63-2.2-1-3.47-1s-2.46.37-3.47 1H3Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 10. Searching
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_12" id = "__nav_12_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_12_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_12" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 10. Searching
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_searching/binary_search/" class = "md-nav__link" >
< span class = "md-ellipsis" >
10.1 Binary search
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_searching/binary_search_insertion/" class = "md-nav__link" >
< span class = "md-ellipsis" >
10.2 Binary search insertion
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_searching/binary_search_edge/" class = "md-nav__link" >
< span class = "md-ellipsis" >
10.3 Binary search boundaries
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_searching/replace_linear_by_hashing/" class = "md-nav__link" >
< span class = "md-ellipsis" >
10.4 Hashing optimization strategies
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_searching/searching_algorithm_revisited/" class = "md-nav__link" >
< span class = "md-ellipsis" >
10.5 Search algorithms revisited
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_searching/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
10.6 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_13" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_sorting/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M19 17h3l-4 4-4-4h3V3h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2v-2Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 11. Sorting
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_13" id = "__nav_13_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_13_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_13" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 11. Sorting
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/sorting_algorithm/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.1 Sorting algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/selection_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.2 Selection sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/bubble_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.3 Bubble sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/insertion_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.4 Insertion sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/quick_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.5 Quick sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/merge_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.6 Merge sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/heap_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.7 Heap sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/bucket_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.8 Bucket sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/counting_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.9 Counting sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/radix_sort/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.10 Radix sort
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_sorting/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
11.11 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_14" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_divide_and_conquer/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M17 7v2h5V7h-5M2 9v6h5V9H2m10 0v2H9v2h3v2l3-3-3-3m5 2v2h5v-2h-5m0 4v2h5v-2h-5Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 12. Divide and conquer
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_14" id = "__nav_14_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_14_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_14" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 12. Divide and conquer
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_divide_and_conquer/divide_and_conquer/" class = "md-nav__link" >
< span class = "md-ellipsis" >
12.1 Divide and conquer algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_divide_and_conquer/binary_search_recur/" class = "md-nav__link" >
< span class = "md-ellipsis" >
12.2 Divide and conquer search strategy
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_divide_and_conquer/build_binary_tree_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
12.3 Building binary tree problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_divide_and_conquer/hanota_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
12.4 Tower of Hanoi Problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_divide_and_conquer/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
12.5 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_15" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_backtracking/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M18 15a3 3 0 0 1 3 3 3 3 0 0 1-3 3 2.99 2.99 0 0 1-2.83-2H14v-2h1.17c.41-1.17 1.52-2 2.83-2m0 2a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1m0-9a1.43 1.43 0 0 0 1.43-1.43 1.43 1.43 0 1 0-2.86 0A1.43 1.43 0 0 0 18 8m0-5.43a4 4 0 0 1 4 4C22 9.56 18 14 18 14s-4-4.44-4-7.43a4 4 0 0 1 4-4M8.83 17H10v2H8.83A2.99 2.99 0 0 1 6 21a3 3 0 0 1-3-3c0-1.31.83-2.42 2-2.83V14h2v1.17c.85.3 1.53.98 1.83 1.83M6 17a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1M6 3a3 3 0 0 1 3 3c0 1.31-.83 2.42-2 2.83V10H5V8.83A2.99 2.99 0 0 1 3 6a3 3 0 0 1 3-3m0 2a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1m5 14v-2h2v2h-2m-4-6H5v-2h2v2Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 13. Backtracking
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_15" id = "__nav_15_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_15_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_15" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 13. Backtracking
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_backtracking/backtracking_algorithm/" class = "md-nav__link" >
< span class = "md-ellipsis" >
13.1 Backtracking algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_backtracking/permutations_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
13.2 Permutation problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_backtracking/subset_sum_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
13.3 Subset sum problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_backtracking/n_queens_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
13.4 n queens problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_backtracking/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
13.5 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_16" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_dynamic_programming/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M22 15h-2v3c0 1.11-.89 2-2 2h-3v2l-3-3 3-3v2h3v-3h-2l3-3 3 3m0-11v4c0 1.1-.9 2-2 2H10v10c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2M4 8h4V4H4v4m0 2v4h4v-4H4m4 10v-4H4v4h4m6-12V4h-4v4h4m6-4h-4v4h4V4Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 14. Dynamic programming
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_16" id = "__nav_16_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_16_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_16" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 14. Dynamic programming
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_dynamic_programming/intro_to_dynamic_programming/" class = "md-nav__link" >
< span class = "md-ellipsis" >
14.1 Introduction to dynamic programming
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_dynamic_programming/dp_problem_features/" class = "md-nav__link" >
< span class = "md-ellipsis" >
14.2 Characteristics of DP problems
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_dynamic_programming/dp_solution_pipeline/" class = "md-nav__link" >
< span class = "md-ellipsis" >
14.3 DP problem-solving approach¶
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_dynamic_programming/knapsack_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
14.4 0-1 Knapsack problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_dynamic_programming/unbounded_knapsack_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
14.5 Unbounded knapsack problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_dynamic_programming/edit_distance_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
14.6 Edit distance problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_dynamic_programming/summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
14.7 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--active md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_17" checked >
< div class = "md-nav__link md-nav__container" >
< a href = "../" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M13 3c3.88 0 7 3.14 7 7 0 2.8-1.63 5.19-4 6.31V21H9v-3H8c-1.11 0-2-.89-2-2v-3H4.5c-.42 0-.66-.5-.42-.81L6 9.66A7.003 7.003 0 0 1 13 3m0-2C8.41 1 4.61 4.42 4.06 8.9L2.5 11h-.03l-.02.03c-.55.76-.62 1.76-.19 2.59.36.69 1 1.17 1.74 1.32V16c0 1.85 1.28 3.42 3 3.87V23h11v-5.5c2.5-1.67 4-4.44 4-7.5 0-4.97-4.04-9-9-9m4 7.83c0 1.54-1.36 2.77-3.42 4.64L13 14l-.58-.53C10.36 11.6 9 10.37 9 8.83c0-1.2.96-2.19 2.16-2.2h.04c.69 0 1.35.31 1.8.83.45-.52 1.11-.83 1.8-.83 1.2-.01 2.2.96 2.2 2.16v.04Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 15. Greedy
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_17" id = "__nav_17_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_17_label" aria-expanded = "true" >
< label class = "md-nav__title" for = "__nav_17" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 15. Greedy
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item md-nav__item--active" >
< input class = "md-nav__toggle md-toggle" type = "checkbox" id = "__toc" >
< label class = "md-nav__link md-nav__link--active" for = "__toc" >
< span class = "md-ellipsis" >
15.1 Greedy algorithms
< / span >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< a href = "./" class = "md-nav__link md-nav__link--active" >
< span class = "md-ellipsis" >
15.1 Greedy algorithms
< / span >
< / a >
< nav class = "md-nav md-nav--secondary" aria-label = "Table of contents" >
< label class = "md-nav__title" for = "__toc" >
< span class = "md-nav__icon md-icon" > < / span >
Table of contents
< / label >
< ul class = "md-nav__list" data-md-component = "toc" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "#1511-advantages-and-limitations-of-greedy-algorithms" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.1.1 Advantages and limitations of greedy algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#1512-characteristics-of-greedy-algorithms" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.1.2 Characteristics of greedy algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#1513-steps-for-solving-problems-with-greedy-algorithms" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.1.3 Steps for solving problems with greedy algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#1514-typical-problems-solved-by-greedy-algorithms" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.1.4 Typical problems solved by greedy algorithms
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "../fractional_knapsack_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.2 Fractional knapsack problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../max_capacity_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.3 Maximum capacity problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../max_product_cutting_problem/" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.4 Maximum product cutting problem
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../summary/" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.5 Summary
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_18" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_appendix/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z" / > < / svg >
< span class = "md-ellipsis" >
Chapter 16. Appendix
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_18" id = "__nav_18_label" tabindex = "0" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_18_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_18" >
< span class = "md-nav__icon md-icon" > < / span >
Chapter 16. Appendix
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../../chapter_appendix/installation/" class = "md-nav__link" >
< span class = "md-ellipsis" >
16.1 Installation
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_appendix/contribution/" class = "md-nav__link" >
< span class = "md-ellipsis" >
16.2 Contributing
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../../chapter_appendix/terminology/" class = "md-nav__link" >
< span class = "md-ellipsis" >
16.3 Terminology
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_19" >
< div class = "md-nav__link md-nav__container" >
< a href = "../../chapter_reference/" class = "md-nav__link " >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M9 3v15h3V3H9m3 2 4 13 3-1-4-13-3 1M5 5v13h3V5H5M3 19v2h18v-2H3Z" / > < / svg >
< span class = "md-ellipsis" >
References
< / span >
< / a >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_19_label" aria-expanded = "false" >
< label class = "md-nav__title" for = "__nav_19" >
< span class = "md-nav__icon md-icon" > < / span >
References
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-sidebar md-sidebar--secondary" data-md-component = "sidebar" data-md-type = "toc" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav class = "md-nav md-nav--secondary" aria-label = "Table of contents" >
< label class = "md-nav__title" for = "__toc" >
< span class = "md-nav__icon md-icon" > < / span >
Table of contents
< / label >
< ul class = "md-nav__list" data-md-component = "toc" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "#1511-advantages-and-limitations-of-greedy-algorithms" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.1.1 Advantages and limitations of greedy algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#1512-characteristics-of-greedy-algorithms" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.1.2 Characteristics of greedy algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#1513-steps-for-solving-problems-with-greedy-algorithms" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.1.3 Steps for solving problems with greedy algorithms
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#1514-typical-problems-solved-by-greedy-algorithms" class = "md-nav__link" >
< span class = "md-ellipsis" >
15.1.4 Typical problems solved by greedy algorithms
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-content" data-md-component = "content" >
< article class = "md-content__inner md-typeset" >
<!-- Tags -->
<!-- Actions -->
<!-- Actions -->
<!-- Edit button -->
< a
href="https://github.com/krahets/hello-algo/tree/main/en/docs/chapter_greedy/greedy_algorithm.md"
title="Edit this page"
class="md-content__button md-icon"
>
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 512 512" > <!-- ! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M441 58.9 453.1 71c9.4 9.4 9.4 24.6 0 33.9L424 134.1 377.9 88 407 58.9c9.4-9.4 24.6-9.4 33.9 0zM209.8 256.2 344 121.9l46.1 46.1-134.3 134.2c-2.9 2.9-6.5 5-10.4 6.1L186.9 325l16.7-58.5c1.1-3.9 3.2-7.5 6.1-10.4zM373.1 25 175.8 222.2c-8.7 8.7-15 19.4-18.3 31.1l-28.6 100c-2.4 8.4-.1 17.4 6.1 23.6s15.2 8.5 23.6 6.1l100-28.6c11.8-3.4 22.5-9.7 31.1-18.3L487 138.9c28.1-28.1 28.1-73.7 0-101.8L474.9 25c-28.1-28.1-73.7-28.1-101.8 0zM88 64c-48.6 0-88 39.4-88 88v272c0 48.6 39.4 88 88 88h272c48.6 0 88-39.4 88-88V312c0-13.3-10.7-24-24-24s-24 10.7-24 24v112c0 22.1-17.9 40-40 40H88c-22.1 0-40-17.9-40-40V152c0-22.1 17.9-40 40-40h112c13.3 0 24-10.7 24-24s-10.7-24-24-24H88z" / > < / svg >
< / a >
<!-- View button -->
<!-- Page content -->
< h1 id = "151-greedy-algorithms" > 15.1 Greedy algorithms< a class = "headerlink" href = "#151-greedy-algorithms" title = "Permanent link" > ¶ < / a > < / h1 >
< p > < u > Greedy algorithm< / u > is a common algorithm for solving optimization problems, which fundamentally involves making the seemingly best choice at each decision-making stage of the problem, i.e., greedily making locally optimal decisions in hopes of finding a globally optimal solution. Greedy algorithms are concise and efficient, and are widely used in many practical problems.< / p >
< p > Greedy algorithms and dynamic programming are both commonly used to solve optimization problems. They share some similarities, such as relying on the property of optimal substructure, but they operate differently.< / p >
< ul >
< li > Dynamic programming considers all previous decisions at the current decision stage and uses solutions to past subproblems to construct solutions for the current subproblem.< / li >
< li > Greedy algorithms do not consider past decisions; instead, they proceed with greedy choices, continually narrowing the scope of the problem until it is solved.< / li >
< / ul >
< p > Let's first understand the working principle of the greedy algorithm through the example of "coin change," which has been introduced in the "Complete Knapsack Problem" chapter. I believe you are already familiar with it.< / p >
< div class = "admonition question" >
< p class = "admonition-title" > Question< / p >
< p > Given < span class = "arithmatex" > \(n\)< / span > types of coins, where the denomination of the < span class = "arithmatex" > \(i\)< / span > th type of coin is < span class = "arithmatex" > \(coins[i - 1]\)< / span > , and the target amount is < span class = "arithmatex" > \(amt\)< / span > , with each type of coin available indefinitely, what is the minimum number of coins needed to make up the target amount? If it is not possible to make up the target amount, return < span class = "arithmatex" > \(-1\)< / span > .< / p >
< / div >
2024-05-01 07:30:15 +08:00
< p > The greedy strategy adopted in this problem is shown in Figure 15-1. Given the target amount, < strong > we greedily choose the coin that is closest to and not greater than it< / strong > , repeatedly following this step until the target amount is met.< / p >
2024-05-01 06:47:42 +08:00
< p > < a class = "glightbox" href = "../greedy_algorithm.assets/coin_change_greedy_strategy.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "Greedy strategy for coin change" class = "animation-figure" src = "../greedy_algorithm.assets/coin_change_greedy_strategy.png" / > < / a > < / p >
< p align = "center" > Figure 15-1 Greedy strategy for coin change < / p >
< p > The implementation code is as follows:< / p >
< div class = "tabbed-set tabbed-alternate" data-tabs = "1:14" > < input checked = "checked" id = "__tabbed_1_1" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_2" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_3" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_4" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_5" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_6" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_7" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_8" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_9" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_10" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_11" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_12" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_13" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_14" name = "__tabbed_1" type = "radio" / > < div class = "tabbed-labels" > < label for = "__tabbed_1_1" > Python< / label > < label for = "__tabbed_1_2" > C++< / label > < label for = "__tabbed_1_3" > Java< / label > < label for = "__tabbed_1_4" > C#< / label > < label for = "__tabbed_1_5" > Go< / label > < label for = "__tabbed_1_6" > Swift< / label > < label for = "__tabbed_1_7" > JS< / label > < label for = "__tabbed_1_8" > TS< / label > < label for = "__tabbed_1_9" > Dart< / label > < label for = "__tabbed_1_10" > Rust< / label > < label for = "__tabbed_1_11" > C< / label > < label for = "__tabbed_1_12" > Kotlin< / label > < label for = "__tabbed_1_13" > Ruby< / label > < label for = "__tabbed_1_14" > Zig< / label > < / div >
< div class = "tabbed-content" >
< div class = "tabbed-block" >
< div class = "highlight" > < span class = "filename" > coin_change_greedy.py< / span > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "k" > def< / span > < span class = "nf" > coin_change_greedy< / span > < span class = "p" > (< / span > < span class = "n" > coins< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ],< / span > < span class = "n" > amt< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Coin change: Greedy" " " < / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "c1" > # Assume coins list is ordered< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > i< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > coins< / span > < span class = "p" > )< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > count< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "c1" > # Loop for greedy selection until no remaining amount< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "k" > while< / span > < span class = "n" > amt< / span > < span class = "o" > > < / span > < span class = "mi" > 0< / span > < span class = "p" > :< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "c1" > # Find the smallest coin close to and less than the remaining amount< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "k" > while< / span > < span class = "n" > i< / span > < span class = "o" > > < / span > < span class = "mi" > 0< / span > < span class = "ow" > and< / span > < span class = "n" > coins< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span > < span class = "o" > > < / span > < span class = "n" > amt< / span > < span class = "p" > :< / span >
< a id = "__codelineno-0-10" name = "__codelineno-0-10" href = "#__codelineno-0-10" > < / a > < span class = "n" > i< / span > < span class = "o" > -=< / span > < span class = "mi" > 1< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-0-11" name = "__codelineno-0-11" href = "#__codelineno-0-11" > < / a > < span class = "c1" > # Choose coins[i]< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-0-12" name = "__codelineno-0-12" href = "#__codelineno-0-12" > < / a > < span class = "n" > amt< / span > < span class = "o" > -=< / span > < span class = "n" > coins< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span >
< a id = "__codelineno-0-13" name = "__codelineno-0-13" href = "#__codelineno-0-13" > < / a > < span class = "n" > count< / span > < span class = "o" > +=< / span > < span class = "mi" > 1< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-0-14" name = "__codelineno-0-14" href = "#__codelineno-0-14" > < / a > < span class = "c1" > # If no feasible solution is found, return -1< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-0-15" name = "__codelineno-0-15" href = "#__codelineno-0-15" > < / a > < span class = "k" > return< / span > < span class = "n" > count< / span > < span class = "k" > if< / span > < span class = "n" > amt< / span > < span class = "o" > ==< / span > < span class = "mi" > 0< / span > < span class = "k" > else< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span >
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.cpp< / span > < pre > < span > < / span > < code > < a id = "__codelineno-1-1" name = "__codelineno-1-1" href = "#__codelineno-1-1" > < / a > < span class = "p" > [< / span > < span class = "k" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "n" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > coinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.java< / span > < pre > < span > < / span > < code > < a id = "__codelineno-2-1" name = "__codelineno-2-1" href = "#__codelineno-2-1" > < / a > < span class = "cm" > /* Coin change: Greedy */< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-2-2" name = "__codelineno-2-2" href = "#__codelineno-2-2" > < / a > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "nf" > coinChangeGreedy< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "o" > []< / span > < span class = "w" > < / span > < span class = "n" > coins< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > amt< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-2-3" name = "__codelineno-2-3" href = "#__codelineno-2-3" > < / a > < span class = "w" > < / span > < span class = "c1" > // Assume coins list is ordered< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-2-4" name = "__codelineno-2-4" href = "#__codelineno-2-4" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > coins< / span > < span class = "p" > .< / span > < span class = "na" > length< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-2-5" name = "__codelineno-2-5" href = "#__codelineno-2-5" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > count< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "mi" > 0< / span > < span class = "p" > ;< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-2-6" name = "__codelineno-2-6" href = "#__codelineno-2-6" > < / a > < span class = "w" > < / span > < span class = "c1" > // Loop for greedy selection until no remaining amount< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-2-7" name = "__codelineno-2-7" href = "#__codelineno-2-7" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > amt< / span > < span class = "w" > < / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "mi" > 0< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-2-8" name = "__codelineno-2-8" href = "#__codelineno-2-8" > < / a > < span class = "w" > < / span > < span class = "c1" > // Find the smallest coin close to and less than the remaining amount< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-2-9" name = "__codelineno-2-9" href = "#__codelineno-2-9" > < / a > < span class = "w" > < / span > < span class = "k" > while< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "mi" > 0< / span > < span class = "w" > < / span > < span class = "o" > & & < / span > < span class = "w" > < / span > < span class = "n" > coins< / span > < span class = "o" > [< / span > < span class = "n" > i< / span > < span class = "o" > ]< / span > < span class = "w" > < / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > amt< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-2-10" name = "__codelineno-2-10" href = "#__codelineno-2-10" > < / a > < span class = "w" > < / span > < span class = "n" > i< / span > < span class = "o" > --< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-2-11" name = "__codelineno-2-11" href = "#__codelineno-2-11" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-2-12" name = "__codelineno-2-12" href = "#__codelineno-2-12" > < / a > < span class = "w" > < / span > < span class = "c1" > // Choose coins[i]< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-2-13" name = "__codelineno-2-13" href = "#__codelineno-2-13" > < / a > < span class = "w" > < / span > < span class = "n" > amt< / span > < span class = "w" > < / span > < span class = "o" > -=< / span > < span class = "w" > < / span > < span class = "n" > coins< / span > < span class = "o" > [< / span > < span class = "n" > i< / span > < span class = "o" > ]< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-2-14" name = "__codelineno-2-14" href = "#__codelineno-2-14" > < / a > < span class = "w" > < / span > < span class = "n" > count< / span > < span class = "o" > ++< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-2-15" name = "__codelineno-2-15" href = "#__codelineno-2-15" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
2024-05-06 05:27:15 +08:00
< a id = "__codelineno-2-16" name = "__codelineno-2-16" href = "#__codelineno-2-16" > < / a > < span class = "w" > < / span > < span class = "c1" > // If no feasible solution is found, return -1< / span >
2024-05-01 06:47:42 +08:00
< a id = "__codelineno-2-17" name = "__codelineno-2-17" href = "#__codelineno-2-17" > < / a > < span class = "w" > < / span > < span class = "k" > return< / span > < span class = "w" > < / span > < span class = "n" > amt< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "mi" > 0< / span > < span class = "w" > < / span > < span class = "o" > ?< / span > < span class = "w" > < / span > < span class = "n" > count< / span > < span class = "w" > < / span > < span class = "p" > :< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-2-18" name = "__codelineno-2-18" href = "#__codelineno-2-18" > < / a > < span class = "p" > }< / span >
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.cs< / span > < pre > < span > < / span > < code > < a id = "__codelineno-3-1" name = "__codelineno-3-1" href = "#__codelineno-3-1" > < / a > < span class = "na" > [class]< / span > < span class = "p" > {< / span > < span class = "n" > coin_change_greedy< / span > < span class = "p" > }< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "n" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > CoinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.go< / span > < pre > < span > < / span > < code > < a id = "__codelineno-4-1" name = "__codelineno-4-1" href = "#__codelineno-4-1" > < / a > < span class = "p" > [< / span > < span class = "nx" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "kd" > func< / span > < span class = "p" > ]{< / span > < span class = "nx" > coinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.swift< / span > < pre > < span > < / span > < code > < a id = "__codelineno-5-1" name = "__codelineno-5-1" href = "#__codelineno-5-1" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "kd" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > coinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.js< / span > < pre > < span > < / span > < code > < a id = "__codelineno-6-1" name = "__codelineno-6-1" href = "#__codelineno-6-1" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "nx" > func< / span > < span class = "p" > ]{< / span > < span class = "nx" > coinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.ts< / span > < pre > < span > < / span > < code > < a id = "__codelineno-7-1" name = "__codelineno-7-1" href = "#__codelineno-7-1" > < / a > < span class = "p" > [< / span > < span class = "kd" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "nx" > func< / span > < span class = "p" > ]{< / span > < span class = "nx" > coinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.dart< / span > < pre > < span > < / span > < code > < a id = "__codelineno-8-1" name = "__codelineno-8-1" href = "#__codelineno-8-1" > < / a > < span class = "p" > [< / span > < span class = "n" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "n" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > coinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.rs< / span > < pre > < span > < / span > < code > < a id = "__codelineno-9-1" name = "__codelineno-9-1" href = "#__codelineno-9-1" > < / a > < span class = "p" > [< / span > < span class = "n" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "n" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > coin_change_greedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.c< / span > < pre > < span > < / span > < code > < a id = "__codelineno-10-1" name = "__codelineno-10-1" href = "#__codelineno-10-1" > < / a > < span class = "p" > [< / span > < span class = "n" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "n" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > coinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
2024-05-06 05:27:15 +08:00
< div class = "highlight" > < span class = "filename" > coin_change_greedy.kt< / span > < pre > < span > < / span > < code > < a id = "__codelineno-11-1" name = "__codelineno-11-1" href = "#__codelineno-11-1" > < / a > < span class = "o" > [< / span > < span class = "n" > class< / span > < span class = "o" > ]< / span > < span class = "p" > {}< / span > < span class = "o" > -[< / span > < span class = "n" > func< / span > < span class = "o" > ]< / span > < span class = "p" > {< / span > < span class = "n" > coinChangeGreedy< / span > < span class = "p" > }< / span >
2024-05-01 06:47:42 +08:00
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
< div class = "highlight" > < span class = "filename" > coin_change_greedy.rb< / span > < pre > < span > < / span > < code > < a id = "__codelineno-12-1" name = "__codelineno-12-1" href = "#__codelineno-12-1" > < / a > < span class = "o" > [< / span > < span class = "n" > class< / span > < span class = "o" > ]< / span > < span class = "p" > {}< / span > < span class = "o" > -[< / span > < span class = "n" > func< / span > < span class = "o" > ]< / span > < span class = "p" > {< / span > < span class = "n" > coin_change_greedy< / span > < span class = "p" > }< / span >
< / code > < / pre > < / div >
< / div >
< div class = "tabbed-block" >
< div class = "highlight" > < span class = "filename" > coin_change_greedy.zig< / span > < pre > < span > < / span > < code > < a id = "__codelineno-13-1" name = "__codelineno-13-1" href = "#__codelineno-13-1" > < / a > < span class = "p" > [< / span > < span class = "n" > class< / span > < span class = "p" > ]{}< / span > < span class = "o" > -< / span > < span class = "p" > [< / span > < span class = "n" > func< / span > < span class = "p" > ]{< / span > < span class = "n" > coinChangeGreedy< / span > < span class = "p" > }< / span >
< / code > < / pre > < / div >
< / div >
< / div >
< / div >
< p > You might exclaim: So clean! The greedy algorithm solves the coin change problem in about ten lines of code.< / p >
< h2 id = "1511-advantages-and-limitations-of-greedy-algorithms" > 15.1.1 Advantages and limitations of greedy algorithms< a class = "headerlink" href = "#1511-advantages-and-limitations-of-greedy-algorithms" title = "Permanent link" > ¶ < / a > < / h2 >
< p > < strong > Greedy algorithms are not only straightforward and simple to implement, but they are also usually very efficient< / strong > . In the code above, if the smallest coin denomination is < span class = "arithmatex" > \(\min(coins)\)< / span > , the greedy choice loops at most < span class = "arithmatex" > \(amt / \min(coins)\)< / span > times, giving a time complexity of < span class = "arithmatex" > \(O(amt / \min(coins))\)< / span > . This is an order of magnitude smaller than the time complexity of the dynamic programming solution, which is < span class = "arithmatex" > \(O(n \times amt)\)< / span > .< / p >
2024-05-01 07:30:15 +08:00
< p > However, < strong > for some combinations of coin denominations, greedy algorithms cannot find the optimal solution< / strong > . Figure 15-2 provides two examples.< / p >
2024-05-01 06:47:42 +08:00
< ul >
< li > < strong > Positive example < span class = "arithmatex" > \(coins = [1, 5, 10, 20, 50, 100]\)< / span > < / strong > : In this coin combination, given any < span class = "arithmatex" > \(amt\)< / span > , the greedy algorithm can find the optimal solution.< / li >
< li > < strong > Negative example < span class = "arithmatex" > \(coins = [1, 20, 50]\)< / span > < / strong > : Suppose < span class = "arithmatex" > \(amt = 60\)< / span > , the greedy algorithm can only find the combination < span class = "arithmatex" > \(50 + 1 \times 10\)< / span > , totaling 11 coins, but dynamic programming can find the optimal solution of < span class = "arithmatex" > \(20 + 20 + 20\)< / span > , needing only 3 coins.< / li >
< li > < strong > Negative example < span class = "arithmatex" > \(coins = [1, 49, 50]\)< / span > < / strong > : Suppose < span class = "arithmatex" > \(amt = 98\)< / span > , the greedy algorithm can only find the combination < span class = "arithmatex" > \(50 + 1 \times 48\)< / span > , totaling 49 coins, but dynamic programming can find the optimal solution of < span class = "arithmatex" > \(49 + 49\)< / span > , needing only 2 coins.< / li >
< / ul >
< p > < a class = "glightbox" href = "../greedy_algorithm.assets/coin_change_greedy_vs_dp.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "Examples where greedy algorithms do not find the optimal solution" class = "animation-figure" src = "../greedy_algorithm.assets/coin_change_greedy_vs_dp.png" / > < / a > < / p >
< p align = "center" > Figure 15-2 Examples where greedy algorithms do not find the optimal solution < / p >
< p > This means that for the coin change problem, greedy algorithms cannot guarantee finding the globally optimal solution, and they might find a very poor solution. They are better suited for dynamic programming.< / p >
< p > Generally, the suitability of greedy algorithms falls into two categories.< / p >
< ol >
< li > < strong > Guaranteed to find the optimal solution< / strong > : In these cases, greedy algorithms are often the best choice, as they tend to be more efficient than backtracking or dynamic programming.< / li >
< li > < strong > Can find a near-optimal solution< / strong > : Greedy algorithms are also applicable here. For many complex problems, finding the global optimal solution is very challenging, and being able to find a high-efficiency suboptimal solution is also very commendable.< / li >
< / ol >
< h2 id = "1512-characteristics-of-greedy-algorithms" > 15.1.2 Characteristics of greedy algorithms< a class = "headerlink" href = "#1512-characteristics-of-greedy-algorithms" title = "Permanent link" > ¶ < / a > < / h2 >
< p > So, what kind of problems are suitable for solving with greedy algorithms? Or rather, under what conditions can greedy algorithms guarantee to find the optimal solution?< / p >
< p > Compared to dynamic programming, greedy algorithms have stricter usage conditions, focusing mainly on two properties of the problem.< / p >
< ul >
< li > < strong > Greedy choice property< / strong > : Only when the locally optimal choice can always lead to a globally optimal solution can greedy algorithms guarantee to obtain the optimal solution.< / li >
< li > < strong > Optimal substructure< / strong > : The optimal solution to the original problem contains the optimal solutions to its subproblems.< / li >
< / ul >
< p > Optimal substructure has already been introduced in the "Dynamic Programming" chapter, so it is not discussed further here. It's important to note that some problems do not have an obvious optimal substructure, but can still be solved using greedy algorithms.< / p >
< p > We mainly explore the method for determining the greedy choice property. Although its description seems simple, < strong > in practice, proving the greedy choice property for many problems is not easy< / strong > .< / p >
< p > For example, in the coin change problem, although we can easily cite counterexamples to disprove the greedy choice property, proving it is much more challenging. If asked, < strong > what conditions must a coin combination meet to be solvable using a greedy algorithm< / strong > ? We often have to rely on intuition or examples to provide an ambiguous answer, as it is difficult to provide a rigorous mathematical proof.< / p >
< div class = "admonition quote" >
< p class = "admonition-title" > Quote< / p >
< p > A paper presents an algorithm with a time complexity of < span class = "arithmatex" > \(O(n^3)\)< / span > for determining whether a coin combination can use a greedy algorithm to find the optimal solution for any amount.< / p >
< p > Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.< / p >
< / div >
< h2 id = "1513-steps-for-solving-problems-with-greedy-algorithms" > 15.1.3 Steps for solving problems with greedy algorithms< a class = "headerlink" href = "#1513-steps-for-solving-problems-with-greedy-algorithms" title = "Permanent link" > ¶ < / a > < / h2 >
< p > The problem-solving process for greedy problems can generally be divided into the following three steps.< / p >
< ol >
< li > < strong > Problem analysis< / strong > : Sort out and understand the characteristics of the problem, including state definition, optimization objectives, and constraints, etc. This step is also involved in backtracking and dynamic programming.< / li >
< li > < strong > Determine the greedy strategy< / strong > : Determine how to make a greedy choice at each step. This strategy can reduce the scale of the problem at each step and eventually solve the entire problem.< / li >
< li > < strong > Proof of correctness< / strong > : It is usually necessary to prove that the problem has both a greedy choice property and optimal substructure. This step may require mathematical proofs, such as induction or reductio ad absurdum.< / li >
< / ol >
< p > Determining the greedy strategy is the core step in solving the problem, but it may not be easy to implement, mainly for the following reasons.< / p >
< ul >
< li > < strong > Greedy strategies vary greatly between different problems< / strong > . For many problems, the greedy strategy is fairly straightforward, and we can come up with it through some general thinking and attempts. However, for some complex problems, the greedy strategy may be very elusive, which is a real test of individual problem-solving experience and algorithmic capability.< / li >
< li > < strong > Some greedy strategies are quite misleading< / strong > . When we confidently design a greedy strategy, write the code, and submit it for testing, it is quite possible that some test cases will not pass. This is because the designed greedy strategy is only "partially correct," as described above with the coin change example.< / li >
< / ul >
< p > To ensure accuracy, we should provide rigorous mathematical proofs for the greedy strategy, < strong > usually involving reductio ad absurdum or mathematical induction< / strong > .< / p >
< p > However, proving correctness may not be an easy task. If we are at a loss, we usually choose to debug the code based on test cases, modifying and verifying the greedy strategy step by step.< / p >
< h2 id = "1514-typical-problems-solved-by-greedy-algorithms" > 15.1.4 Typical problems solved by greedy algorithms< a class = "headerlink" href = "#1514-typical-problems-solved-by-greedy-algorithms" title = "Permanent link" > ¶ < / a > < / h2 >
< p > Greedy algorithms are often applied to optimization problems that satisfy the properties of greedy choice and optimal substructure. Below are some typical greedy algorithm problems.< / p >
< ul >
< li > < strong > Coin change problem< / strong > : In some coin combinations, the greedy algorithm always provides the optimal solution.< / li >
< li > < strong > Interval scheduling problem< / strong > : Suppose you have several tasks, each of which takes place over a period of time. Your goal is to complete as many tasks as possible. If you always choose the task that ends the earliest, then the greedy algorithm can achieve the optimal solution.< / li >
< li > < strong > Fractional knapsack problem< / strong > : Given a set of items and a carrying capacity, your goal is to select a set of items such that the total weight does not exceed the carrying capacity and the total value is maximized. If you always choose the item with the highest value-to-weight ratio (value / weight), the greedy algorithm can achieve the optimal solution in some cases.< / li >
< li > < strong > Stock trading problem< / strong > : Given a set of historical stock prices, you can make multiple trades, but you cannot buy again until after you have sold if you already own stocks. The goal is to achieve the maximum profit.< / li >
< li > < strong > Huffman coding< / strong > : Huffman coding is a greedy algorithm used for lossless data compression. By constructing a Huffman tree, it always merges the two nodes with the lowest frequency, resulting in a Huffman tree with the minimum weighted path length (coding length).< / li >
< li > < strong > Dijkstra's algorithm< / strong > : It is a greedy algorithm for solving the shortest path problem from a given source vertex to all other vertices.< / li >
< / ul >
<!-- Source file information -->
<!-- Was this page helpful? -->
<!-- Previous and next pages link -->
< nav
class="md-footer__inner md-grid"
aria-label="Footer"
>
<!-- Link to previous page -->
< a
href="../"
class="md-footer__link md-footer__link--prev"
aria-label="Previous: Chapter 15. & nbsp; Greedy"
rel="prev"
>
< div class = "md-footer__button md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z" / > < / svg >
< / div >
< div class = "md-footer__title" >
< span class = "md-footer__direction" >
Previous
< / span >
< div class = "md-ellipsis" >
Chapter 15. Greedy
< / div >
< / div >
< / a >
<!-- Link to next page -->
< a
href="../fractional_knapsack_problem/"
class="md-footer__link md-footer__link--next"
aria-label="Next: 15.2 Fractional knapsack problem"
rel="next"
>
< div class = "md-footer__title" >
< span class = "md-footer__direction" >
Next
< / span >
< div class = "md-ellipsis" >
15.2 Fractional knapsack problem
< / div >
< / div >
< div class = "md-footer__button md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z" / > < / svg >
< / div >
< / a >
< / nav >
<!-- Comment system -->
< h5 align = "center" id = "__comments" > Feel free to drop your insights, questions or suggestions< / h5 >
<!-- Insert generated snippet here -->
< script
src="https://giscus.app/client.js"
data-repo="krahets/hello-algo"
data-repo-id="R_kgDOIXtSqw"
data-category="Announcements"
data-category-id="DIC_kwDOIXtSq84CSZk_"
data-mapping="pathname"
data-strict="1"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
crossorigin="anonymous"
async
>
< / script >
<!-- Synchronize Giscus theme with palette -->
< script >
var giscus = document.querySelector("script[src*=giscus]")
/* Set palette on initial load */
var palette = __md_get("__palette")
if (palette & & typeof palette.color === "object") {
var theme = palette.color.scheme === "slate" ? "dark_dimmed" : "light"
giscus.setAttribute("data-theme", theme)
}
/* Register event handlers after documented loaded */
document.addEventListener("DOMContentLoaded", function() {
var ref = document.querySelector("[data-md-component=palette]")
ref.addEventListener("change", function() {
var palette = __md_get("__palette")
if (palette & & typeof palette.color === "object") {
var theme = palette.color.scheme === "slate" ? "dark_dimmed" : "light"
/* Instruct Giscus to change theme */
var frame = document.querySelector(".giscus-frame")
frame.contentWindow.postMessage(
{ giscus: { setConfig: { theme } } },
"https://giscus.app"
)
}
})
})
< / script >
< / article >
< / div >
< script > var tabs = _ _md _get ( "__tabs" ) ; if ( Array . isArray ( tabs ) ) e : for ( var set of document . querySelectorAll ( ".tabbed-set" ) ) { var tab , labels = set . querySelector ( ".tabbed-labels" ) ; for ( tab of tabs ) for ( var label of labels . getElementsByTagName ( "label" ) ) if ( label . innerText . trim ( ) === tab ) { var input = document . getElementById ( label . htmlFor ) ; input . checked = ! 0 ; continue e } } < / script >
< script > var target = document . getElementById ( location . hash . slice ( 1 ) ) ; target && target . name && ( target . checked = target . name . startsWith ( "__tabbed_" ) ) < / script >
< / div >
< button type = "button" class = "md-top md-icon" data-md-component = "top" hidden >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z" / > < / svg >
Back to top
< / button >
< / main >
< footer class = "md-footer" >
< nav class = "md-footer__inner md-grid" aria-label = "Footer" >
< a href = "../" class = "md-footer__link md-footer__link--prev" aria-label = "Previous: Chapter 15. &nbsp; Greedy" >
< div class = "md-footer__button md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z" / > < / svg >
< / div >
< div class = "md-footer__title" >
< span class = "md-footer__direction" >
Previous
< / span >
< div class = "md-ellipsis" >
Chapter 15. Greedy
< / div >
< / div >
< / a >
< a href = "../fractional_knapsack_problem/" class = "md-footer__link md-footer__link--next" aria-label = "Next: 15.2 Fractional knapsack problem" >
< div class = "md-footer__title" >
< span class = "md-footer__direction" >
Next
< / span >
< div class = "md-ellipsis" >
15.2 Fractional knapsack problem
< / div >
< / div >
< div class = "md-footer__button md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z" / > < / svg >
< / div >
< / a >
< / nav >
< div class = "md-footer-meta md-typeset" >
< div class = "md-footer-meta__inner md-grid" >
< div class = "md-copyright" >
< div class = "md-copyright__highlight" >
2024-05-02 01:46:20 +08:00
Copyright © 2024 krahets< br > The website content is licensed under < a href = "https://creativecommons.org/licenses/by-nc-sa/4.0/" > CC BY-NC-SA 4.0< / a >
2024-05-01 06:47:42 +08:00
< / div >
< / div >
< div class = "md-social" >
< a href = "https://github.com/krahets" target = "_blank" rel = "noopener" title = "github.com" class = "md-social__link" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 496 512" > <!-- ! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z" / > < / svg >
< / a >
< a href = "https://twitter.com/krahets" target = "_blank" rel = "noopener" title = "twitter.com" class = "md-social__link" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 512 512" > <!-- ! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9L389.2 48zm-24.8 373.8h39.1L151.1 88h-42l255.3 333.8z" / > < / svg >
< / a >
< a href = "https://leetcode.cn/u/jyd/" target = "_blank" rel = "noopener" title = "leetcode.cn" class = "md-social__link" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 640 512" > <!-- ! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3l89.3 89.4-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3z" / > < / svg >
< / a >
< / div >
< / div >
< / div >
< / footer >
< / div >
< div class = "md-dialog" data-md-component = "dialog" >
< div class = "md-dialog__inner md-typeset" > < / div >
< / div >
< script id = "__config" type = "application/json" > { "base" : "../.." , "features" : [ "announce.dismiss" , "content.action.edit" , "content.code.annotate" , "content.code.copy" , "content.tabs.link" , "content.tooltips" , "navigation.indexes" , "navigation.top" , "navigation.footer" , "navigation.tracking" , "search.highlight" , "search.share" , "search.suggest" , "toc.follow" ] , "search" : "../../assets/javascripts/workers/search.b8dbb3d2.min.js" , "translations" : { "clipboard.copied" : "Copied to clipboard" , "clipboard.copy" : "Copy to clipboard" , "search.result.more.one" : "1 more on this page" , "search.result.more.other" : "# more on this page" , "search.result.none" : "No matching documents" , "search.result.one" : "1 matching document" , "search.result.other" : "# matching documents" , "search.result.placeholder" : "Type to start searching" , "search.result.term.missing" : "Missing" , "select.version" : "Select version" } } < / script >
< script src = "../../assets/javascripts/bundle.c18c5fb9.min.js" > < / script >
< script src = "../../javascripts/mathjax.js" > < / script >
< script src = "https://polyfill.io/v3/polyfill.min.js?features=es6" > < / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js" > < / script >
< script > document $ . subscribe ( ( ) => { const lightbox = GLightbox ( { "touchNavigation" : true , "loop" : false , "zoomable" : true , "draggable" : false , "openEffect" : "zoom" , "closeEffect" : "zoom" , "slideEffect" : "none" } ) ; } ) < / script > < / body >
< / html >