[{"data":1,"prerenderedAt":3972},["ShallowReactive",2],{"navigation_docs":3,"-phong-van-lo-trinh-ngay-6-dsa":420,"-phong-van-lo-trinh-ngay-6-dsa-surround":3967},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":3960,"extension":3961,"links":3962,"meta":3963,"navigation":3964,"path":58,"seo":3965,"stem":59,"__hash__":3966},"docs\u002F1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa.md","Ngày 6 — DSA coding interview",{"type":424,"value":425,"toc":3886},"minimark",[426,431,435,464,490,493,497,502,547,551,554,677,681,737,742,783,823,859,897,901,911,945,989,993,1188,1190,1194,1201,1205,1213,1216,1218,1222,1226,1248,1269,1273,1309,1313,1326,1381,1387,1392,1396,1414,1423,1441,1448,1452,1458,1527,1531,1587,1591,1605,1609,1651,1655,1726,1759,1761,1765,1769,1782,1786,1817,1826,1830,1844,1877,1882,1886,1899,1903,1937,1941,1946,2037,2040,2045,2093,2097,2223,2227,2243,2247,2278,2282,2307,2337,2339,2343,2347,2376,2379,2385,2389,2394,2403,2407,2416,2436,2440,2445,2451,2455,2521,2525,2538,2542,2553,2557,2565,2604,2607,2621,2643,2645,2649,2653,2672,2676,2688,2692,2740,2744,2751,2816,2821,2899,2902,2906,2972,2976,3001,3005,3018,3022,3036,3040,3096,3098,3102,3106,3115,3125,3129,3132,3136,3176,3180,3184,3309,3312,3316,3382,3386,3398,3402,3417,3436,3438,3442,3446,3460,3468,3472,3475,3480,3495,3498,3503,3537,3540,3545,3582,3585,3589,3595,3609,3625,3629,3637,3643,3655,3659,3667,3671,3682,3686,3703,3705,3709,3715,3808,3818,3820,3824,3864,3874,3876,3882],[427,428,430],"h2",{"id":429},"mục-tiêu-ngày-6","Mục tiêu ngày 6",[432,433,434],"p",{},"Sau ngày 6, bạn phải:",[436,437,438,446,452,458],"ul",{},[439,440,441,445],"li",{},[442,443,444],"strong",{},"Hiểu Big O"," đến mức tự tính được cho code lạ.",[439,447,448,451],{},[442,449,450],{},"Có pattern suy nghĩ"," khi gặp 1 bài DSA mới (không chỉ học thuộc lời giải).",[439,453,454,457],{},[442,455,456],{},"Giải tự tin 8–10 bài Easy"," trong LeetCode bằng C#.",[439,459,460,463],{},[442,461,462],{},"Trình bày out loud"," khi solve — đây là điểm interview quan trọng nhất.",[465,466,469,479],"callout",{"color":467,"icon":468},"primary","i-lucide-info",[432,470,471,474,475],{},[442,472,473],{},"Triết lý ngày 6:"," ",[476,477,478],"em",{},"\"Một bài DSA giải được không bằng một pattern hiểu sâu áp dụng được cho 20 bài tương tự.\"",[432,480,481,482,485,486,489],{},"Tài liệu này dạy theo ",[442,483,484],{},"framework 8 bước"," chuẩn, áp dụng cho ",[442,487,488],{},"mọi bài DSA interview",".",[491,492],"hr",{},[427,494,496],{"id":495},"_1-big-o-phân-tích-độ-phức-tạp","1. Big O — phân tích độ phức tạp",[498,499,501],"h3",{"id":500},"_11-big-o-là-gì","1.1. Big O là gì?",[465,503,504,518,521],{"color":467,"icon":468},[432,505,506,507,510,511,514,515,489],{},"🟢 ",[442,508,509],{},"Big O"," là ",[442,512,513],{},"cách diễn tả tốc độ tăng của thuật toán khi input lớn lên"," — không phải thời gian thực tế (ms), mà là ",[442,516,517],{},"xu hướng",[432,519,520],{},"Ví dụ: nếu input từ 100 → 1000 (gấp 10), thuật toán:",[436,522,523,529,535,541],{},[439,524,525,528],{},[442,526,527],{},"O(1)",": thời gian không đổi.",[439,530,531,534],{},[442,532,533],{},"O(n)",": thời gian gấp 10.",[439,536,537,540],{},[442,538,539],{},"O(n²)",": thời gian gấp 100.",[439,542,543,546],{},[442,544,545],{},"O(log n)",": thời gian tăng nhẹ (~3.3 lần).",[498,548,550],{"id":549},"_12-bảng-so-sánh-trực-quan","1.2. Bảng so sánh trực quan",[432,552,553],{},"Cho n = 1000:",[555,556,557,575],"table",{},[558,559,560],"thead",{},[561,562,563,566,569,572],"tr",{},[564,565,509],"th",{},[564,567,568],{},"Số lần thao tác",[564,570,571],{},"Tên gọi",[564,573,574],{},"Ví dụ",[576,577,578,596,609,622,636,649,663],"tbody",{},[561,579,580,583,586,589],{},[581,582,527],"td",{},[581,584,585],{},"1",[581,587,588],{},"Constant",[581,590,591,595],{},[592,593,594],"code",{},"arr[i]",", Dictionary lookup",[561,597,598,600,603,606],{},[581,599,545],{},[581,601,602],{},"~10",[581,604,605],{},"Logarithmic",[581,607,608],{},"Binary search",[561,610,611,613,616,619],{},[581,612,533],{},[581,614,615],{},"1,000",[581,617,618],{},"Linear",[581,620,621],{},"Duyệt mảng 1 lần",[561,623,624,627,630,633],{},[581,625,626],{},"O(n log n)",[581,628,629],{},"~10,000",[581,631,632],{},"Linear-log",[581,634,635],{},"Merge sort, Quick sort avg",[561,637,638,640,643,646],{},[581,639,539],{},[581,641,642],{},"1,000,000",[581,644,645],{},"Quadratic",[581,647,648],{},"Nested loop, Bubble sort",[561,650,651,654,657,660],{},[581,652,653],{},"O(2ⁿ)",[581,655,656],{},"2^1000",[581,658,659],{},"Exponential",[581,661,662],{},"Fibonacci naive, subset",[561,664,665,668,671,674],{},[581,666,667],{},"O(n!)",[581,669,670],{},"1000!",[581,672,673],{},"Factorial",[581,675,676],{},"Permutations",[498,678,680],{"id":679},"_13-cách-tính-big-o-quy-tắc","1.3. Cách tính Big O — quy tắc",[465,682,684,690],{"color":683,"icon":268},"warning",[432,685,686,687],{},"🔵 ",[442,688,689],{},"3 quy tắc đếm Big O:",[691,692,693,711,726],"ol",{},[439,694,695,698,699,702,703,705,706,702,709,489],{},[442,696,697],{},"Bỏ hằng số",": ",[592,700,701],{},"O(2n)"," → ",[592,704,533],{},". ",[592,707,708],{},"O(n\u002F2)",[592,710,533],{},[439,712,713,698,716,702,719,705,721,702,724,489],{},[442,714,715],{},"Bỏ term nhỏ hơn",[592,717,718],{},"O(n² + n)",[592,720,539],{},[592,722,723],{},"O(n log n + n)",[592,725,626],{},[439,727,728,731,732,702,735,489],{},[442,729,730],{},"Vòng lặp lồng nhau"," nhân nhau: ",[592,733,734],{},"for (n) { for (n) }",[592,736,539],{},[432,738,739],{},[442,740,741],{},"Ví dụ tính Big O:",[743,744,749],"pre",{"className":745,"code":746,"language":747,"meta":748,"style":748},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Code 1\nfor (int i = 0; i \u003C n; i++) {\n    Console.WriteLine(i);\n}\n\u002F\u002F → O(n) — vòng lặp chạy n lần\n","csharp","",[592,750,751,759,765,771,777],{"__ignoreMap":748},[752,753,756],"span",{"class":754,"line":755},"line",1,[752,757,758],{},"\u002F\u002F Code 1\n",[752,760,762],{"class":754,"line":761},2,[752,763,764],{},"for (int i = 0; i \u003C n; i++) {\n",[752,766,768],{"class":754,"line":767},3,[752,769,770],{},"    Console.WriteLine(i);\n",[752,772,774],{"class":754,"line":773},4,[752,775,776],{},"}\n",[752,778,780],{"class":754,"line":779},5,[752,781,782],{},"\u002F\u002F → O(n) — vòng lặp chạy n lần\n",[743,784,786],{"className":745,"code":785,"language":747,"meta":748,"style":748},"\u002F\u002F Code 2\nfor (int i = 0; i \u003C n; i++) {\n    for (int j = 0; j \u003C n; j++) {\n        Console.WriteLine(i + j);\n    }\n}\n\u002F\u002F → O(n²) — 2 vòng lồng\n",[592,787,788,793,797,802,807,812,817],{"__ignoreMap":748},[752,789,790],{"class":754,"line":755},[752,791,792],{},"\u002F\u002F Code 2\n",[752,794,795],{"class":754,"line":761},[752,796,764],{},[752,798,799],{"class":754,"line":767},[752,800,801],{},"    for (int j = 0; j \u003C n; j++) {\n",[752,803,804],{"class":754,"line":773},[752,805,806],{},"        Console.WriteLine(i + j);\n",[752,808,809],{"class":754,"line":779},[752,810,811],{},"    }\n",[752,813,815],{"class":754,"line":814},6,[752,816,776],{},[752,818,820],{"class":754,"line":819},7,[752,821,822],{},"\u002F\u002F → O(n²) — 2 vòng lồng\n",[743,824,826],{"className":745,"code":825,"language":747,"meta":748,"style":748},"\u002F\u002F Code 3\nfor (int i = 0; i \u003C n; i++) {\n    for (int j = i; j \u003C n; j++) {\n        Console.WriteLine(i + j);\n    }\n}\n\u002F\u002F → Vẫn O(n²) — dù chỉ chạy n(n+1)\u002F2 lần, bỏ hằng số ½\n",[592,827,828,833,837,842,846,850,854],{"__ignoreMap":748},[752,829,830],{"class":754,"line":755},[752,831,832],{},"\u002F\u002F Code 3\n",[752,834,835],{"class":754,"line":761},[752,836,764],{},[752,838,839],{"class":754,"line":767},[752,840,841],{},"    for (int j = i; j \u003C n; j++) {\n",[752,843,844],{"class":754,"line":773},[752,845,806],{},[752,847,848],{"class":754,"line":779},[752,849,811],{},[752,851,852],{"class":754,"line":814},[752,853,776],{},[752,855,856],{"class":754,"line":819},[752,857,858],{},"\u002F\u002F → Vẫn O(n²) — dù chỉ chạy n(n+1)\u002F2 lần, bỏ hằng số ½\n",[743,860,862],{"className":745,"code":861,"language":747,"meta":748,"style":748},"\u002F\u002F Code 4\nint i = n;\nwhile (i > 0) {\n    Console.WriteLine(i);\n    i = i \u002F 2;\n}\n\u002F\u002F → O(log n) — i chia đôi mỗi lần\n",[592,863,864,869,874,879,883,888,892],{"__ignoreMap":748},[752,865,866],{"class":754,"line":755},[752,867,868],{},"\u002F\u002F Code 4\n",[752,870,871],{"class":754,"line":761},[752,872,873],{},"int i = n;\n",[752,875,876],{"class":754,"line":767},[752,877,878],{},"while (i > 0) {\n",[752,880,881],{"class":754,"line":773},[752,882,770],{},[752,884,885],{"class":754,"line":779},[752,886,887],{},"    i = i \u002F 2;\n",[752,889,890],{"class":754,"line":814},[752,891,776],{},[752,893,894],{"class":754,"line":819},[752,895,896],{},"\u002F\u002F → O(log n) — i chia đôi mỗi lần\n",[498,898,900],{"id":899},"_14-time-vs-space-complexity","1.4. Time vs Space complexity",[432,902,903,906,907,910],{},[442,904,905],{},"Time complexity",": số phép tính theo input.\n",[442,908,909],{},"Space complexity",": bộ nhớ thêm dùng theo input (không tính input gốc).",[743,912,914],{"className":745,"code":913,"language":747,"meta":748,"style":748},"public int Sum(int[] arr) {\n    int sum = 0;            \u002F\u002F O(1) space\n    foreach (var x in arr) sum += x;\n    return sum;\n}\n\u002F\u002F Time: O(n), Space: O(1)\n",[592,915,916,921,926,931,936,940],{"__ignoreMap":748},[752,917,918],{"class":754,"line":755},[752,919,920],{},"public int Sum(int[] arr) {\n",[752,922,923],{"class":754,"line":761},[752,924,925],{},"    int sum = 0;            \u002F\u002F O(1) space\n",[752,927,928],{"class":754,"line":767},[752,929,930],{},"    foreach (var x in arr) sum += x;\n",[752,932,933],{"class":754,"line":773},[752,934,935],{},"    return sum;\n",[752,937,938],{"class":754,"line":779},[752,939,776],{},[752,941,942],{"class":754,"line":814},[752,943,944],{},"\u002F\u002F Time: O(n), Space: O(1)\n",[743,946,948],{"className":745,"code":947,"language":747,"meta":748,"style":748},"public int[] Double(int[] arr) {\n    var result = new int[arr.Length];     \u002F\u002F O(n) space\n    for (int i = 0; i \u003C arr.Length; i++) {\n        result[i] = arr[i] * 2;\n    }\n    return result;\n}\n\u002F\u002F Time: O(n), Space: O(n)\n",[592,949,950,955,960,965,970,974,979,983],{"__ignoreMap":748},[752,951,952],{"class":754,"line":755},[752,953,954],{},"public int[] Double(int[] arr) {\n",[752,956,957],{"class":754,"line":761},[752,958,959],{},"    var result = new int[arr.Length];     \u002F\u002F O(n) space\n",[752,961,962],{"class":754,"line":767},[752,963,964],{},"    for (int i = 0; i \u003C arr.Length; i++) {\n",[752,966,967],{"class":754,"line":773},[752,968,969],{},"        result[i] = arr[i] * 2;\n",[752,971,972],{"class":754,"line":779},[752,973,811],{},[752,975,976],{"class":754,"line":814},[752,977,978],{},"    return result;\n",[752,980,981],{"class":754,"line":819},[752,982,776],{},[752,984,986],{"class":754,"line":985},8,[752,987,988],{},"\u002F\u002F Time: O(n), Space: O(n)\n",[498,990,992],{"id":991},"_15-cheat-sheet-big-o-của-data-structure-c","1.5. Cheat sheet — Big O của data structure C#",[555,994,995,1017],{},[558,996,997],{},[561,998,999,1002,1005,1008,1011,1014],{},[564,1000,1001],{},"Data Structure",[564,1003,1004],{},"Access",[564,1006,1007],{},"Search",[564,1009,1010],{},"Insert",[564,1012,1013],{},"Delete",[564,1015,1016],{},"Note",[576,1018,1019,1036,1055,1075,1093,1113,1133,1152,1170],{},[561,1020,1021,1024,1026,1028,1031,1033],{},[581,1022,1023],{},"Array",[581,1025,527],{},[581,1027,533],{},[581,1029,1030],{},"–",[581,1032,1030],{},[581,1034,1035],{},"Cố định size",[561,1037,1038,1043,1045,1047,1050,1052],{},[581,1039,1040],{},[592,1041,1042],{},"List\u003CT>",[581,1044,527],{},[581,1046,533],{},[581,1048,1049],{},"O(1) amortized cuối, O(n) giữa",[581,1051,533],{},[581,1053,1054],{},"Resize × 2 khi đầy",[561,1056,1057,1062,1064,1067,1070,1072],{},[581,1058,1059],{},[592,1060,1061],{},"Dictionary\u003CK,V>",[581,1063,1030],{},[581,1065,1066],{},"O(1) avg, O(n) worst",[581,1068,1069],{},"O(1) avg",[581,1071,1069],{},[581,1073,1074],{},"Hash collision",[561,1076,1077,1082,1084,1086,1088,1090],{},[581,1078,1079],{},[592,1080,1081],{},"HashSet\u003CT>",[581,1083,1030],{},[581,1085,1069],{},[581,1087,1069],{},[581,1089,1069],{},[581,1091,1092],{},"Tương tự Dict",[561,1094,1095,1100,1102,1104,1107,1110],{},[581,1096,1097],{},[592,1098,1099],{},"Queue\u003CT>",[581,1101,1030],{},[581,1103,1030],{},[581,1105,1106],{},"O(1) Enqueue",[581,1108,1109],{},"O(1) Dequeue",[581,1111,1112],{},"FIFO",[561,1114,1115,1120,1122,1124,1127,1130],{},[581,1116,1117],{},[592,1118,1119],{},"Stack\u003CT>",[581,1121,1030],{},[581,1123,1030],{},[581,1125,1126],{},"O(1) Push",[581,1128,1129],{},"O(1) Pop",[581,1131,1132],{},"LIFO",[561,1134,1135,1140,1142,1144,1147,1149],{},[581,1136,1137],{},[592,1138,1139],{},"LinkedList\u003CT>",[581,1141,533],{},[581,1143,533],{},[581,1145,1146],{},"O(1) given node",[581,1148,1146],{},[581,1150,1151],{},"Doubly-linked",[561,1153,1154,1159,1161,1163,1165,1167],{},[581,1155,1156],{},[592,1157,1158],{},"SortedDictionary\u003CK,V>",[581,1160,1030],{},[581,1162,545],{},[581,1164,545],{},[581,1166,545],{},[581,1168,1169],{},"Red-black tree",[561,1171,1172,1177,1179,1181,1183,1185],{},[581,1173,1174],{},[592,1175,1176],{},"PriorityQueue\u003CT,P>",[581,1178,1030],{},[581,1180,1030],{},[581,1182,545],{},[581,1184,545],{},[581,1186,1187],{},"Heap",[491,1189],{},[427,1191,1193],{"id":1192},"_2-framework-8-bước-giải-bài-dsa","2. Framework 8 bước giải bài DSA",[465,1195,686,1197,1200],{"color":683,"icon":1196},"i-lucide-star",[442,1198,1199],{},"Đây là pattern interviewer mong bạn LÀM, không chỉ code im lặng."," Nói thành tiếng các bước này = điểm cộng lớn.",[498,1202,1204],{"id":1203},"framework","Framework:",[743,1206,1211],{"className":1207,"code":1209,"language":1210},[1208],"language-text","1. UNDERSTAND   — đọc kỹ đề, vẽ ví dụ tay\n2. CLARIFY      — hỏi interviewer giả định, edge case\n3. BRUTE FORCE  — giải pháp đơn giản nhất, dù chậm\n4. OPTIMIZE     — cải thiện complexity\n5. DRY RUN      — chạy thử ví dụ bằng tay\n6. CODE         — viết clean, có comment\n7. COMPLEXITY   — phân tích Big O\n8. EDGE CASES   — test mảng rỗng, 1 phần tử, duplicate...\n","text",[592,1212,1209],{"__ignoreMap":748},[432,1214,1215],{},"Bây giờ áp dụng framework này cho từng bài.",[491,1217],{},[427,1219,1221],{"id":1220},"_3-bài-1-two-sum-lc-1-pattern-hashmap","3. Bài 1 — Two Sum (LC 1) — pattern HashMap",[498,1223,1225],{"id":1224},"_31-step-1-understand","3.1. Step 1 — Understand",[432,1227,1228,1231,1232,1235,1236,1239,1240,1243,1244,1247],{},[442,1229,1230],{},"Đề:"," Cho ",[592,1233,1234],{},"int[] nums"," và ",[592,1237,1238],{},"int target",". Tìm 2 chỉ số ",[592,1241,1242],{},"i, j"," sao cho ",[592,1245,1246],{},"nums[i] + nums[j] == target",". Mỗi input có đúng 1 cặp.",[432,1249,1250,474,1253,1256,1257,1260,1261,1264,1265,1268],{},[442,1251,1252],{},"Ví dụ:",[592,1254,1255],{},"nums = [2, 7, 11, 15]",", ",[592,1258,1259],{},"target = 9"," → output ",[592,1262,1263],{},"[0, 1]"," (vì ",[592,1266,1267],{},"nums[0] + nums[1] = 2 + 7 = 9",").",[498,1270,1272],{"id":1271},"_32-step-2-clarify-nói-với-interviewer","3.2. Step 2 — Clarify (nói với interviewer)",[436,1274,1275,1281,1287,1297,1303],{},[439,1276,1277,1280],{},[476,1278,1279],{},"\"Mảng có thể có số âm không?\""," → giả định: có.",[439,1282,1283,1286],{},[476,1284,1285],{},"\"Có thể dùng cùng index 2 lần không?\""," → không.",[439,1288,1289,1292,1293,1296],{},[476,1290,1291],{},"\"Số có thể trùng nhau không?\""," → có (vd ",[592,1294,1295],{},"[3, 3]",", target 6).",[439,1298,1299,1302],{},[476,1300,1301],{},"\"Có chắc chắn có solution không?\""," → đề bài nói có.",[439,1304,1305,1308],{},[476,1306,1307],{},"\"Output cần thứ tự index không?\""," → thường không, nhưng nên trả nhỏ trước.",[498,1310,1312],{"id":1311},"_33-step-3-brute-force","3.3. Step 3 — Brute force",[432,1314,1315,1318,1319,1322,1323,1325],{},[442,1316,1317],{},"Suy nghĩ ban đầu:"," với mỗi cặp ",[592,1320,1321],{},"(i, j)",", check ",[592,1324,1246],{},". → 2 nested loop.",[743,1327,1329],{"className":745,"code":1328,"language":747,"meta":748,"style":748},"public int[] TwoSumBrute(int[] nums, int target) {\n    for (int i = 0; i \u003C nums.Length; i++) {\n        for (int j = i + 1; j \u003C nums.Length; j++) {\n            if (nums[i] + nums[j] == target) {\n                return new[] { i, j };\n            }\n        }\n    }\n    return Array.Empty\u003Cint>();\n}\n",[592,1330,1331,1336,1341,1346,1351,1356,1361,1366,1370,1376],{"__ignoreMap":748},[752,1332,1333],{"class":754,"line":755},[752,1334,1335],{},"public int[] TwoSumBrute(int[] nums, int target) {\n",[752,1337,1338],{"class":754,"line":761},[752,1339,1340],{},"    for (int i = 0; i \u003C nums.Length; i++) {\n",[752,1342,1343],{"class":754,"line":767},[752,1344,1345],{},"        for (int j = i + 1; j \u003C nums.Length; j++) {\n",[752,1347,1348],{"class":754,"line":773},[752,1349,1350],{},"            if (nums[i] + nums[j] == target) {\n",[752,1352,1353],{"class":754,"line":779},[752,1354,1355],{},"                return new[] { i, j };\n",[752,1357,1358],{"class":754,"line":814},[752,1359,1360],{},"            }\n",[752,1362,1363],{"class":754,"line":819},[752,1364,1365],{},"        }\n",[752,1367,1368],{"class":754,"line":985},[752,1369,811],{},[752,1371,1373],{"class":754,"line":1372},9,[752,1374,1375],{},"    return Array.Empty\u003Cint>();\n",[752,1377,1379],{"class":754,"line":1378},10,[752,1380,776],{},[432,1382,1383,1386],{},[442,1384,1385],{},"Complexity:"," O(n²) time, O(1) space.",[432,1388,1389],{},[476,1390,1391],{},"\"OK, đây là cách brute. Em sẽ tối ưu.\"",[498,1393,1395],{"id":1394},"_34-step-4-optimize","3.4. Step 4 — Optimize",[432,1397,1398,1401,1402,1405,1406,1409,1410,1413],{},[442,1399,1400],{},"Insight:"," với mỗi ",[592,1403,1404],{},"nums[i]",", ta cần tìm ",[592,1407,1408],{},"complement = target - nums[i]"," trong mảng. Tìm trong mảng = O(n) bằng linear, nhưng nếu lưu vào ",[442,1411,1412],{},"HashMap"," thì tìm O(1).",[432,1415,1416,1419,1420,1422],{},[442,1417,1418],{},"Ý tưởng:"," duyệt 1 lần. Mỗi số ",[592,1421,1404],{},":",[691,1424,1425,1431,1434],{},[439,1426,1427,1428,1430],{},"Check xem ",[592,1429,1408],{}," đã trong map chưa.",[439,1432,1433],{},"Nếu có → đã tìm thấy cặp.",[439,1435,1436,1437,1440],{},"Nếu chưa → lưu ",[592,1438,1439],{},"nums[i] → i"," vào map, tiếp.",[432,1442,1443,1444,1447],{},"→ ",[442,1445,1446],{},"One-pass HashMap",", O(n) time, O(n) space.",[498,1449,1451],{"id":1450},"_35-step-5-dry-run","3.5. Step 5 — Dry run",[432,1453,1454,1256,1456,489],{},[592,1455,1255],{},[592,1457,1259],{},[555,1459,1460,1484],{},[558,1461,1462],{},[561,1463,1464,1467,1472,1475,1478,1481],{},[564,1465,1466],{},"i",[564,1468,1469,1470],{},"nums",[752,1471,1466],{},[564,1473,1474],{},"complement",[564,1476,1477],{},"map ở đầu",[564,1479,1480],{},"found?",[564,1482,1483],{},"map ở cuối",[576,1485,1486,1506],{},[561,1487,1488,1491,1494,1497,1500,1503],{},[581,1489,1490],{},"0",[581,1492,1493],{},"2",[581,1495,1496],{},"7",[581,1498,1499],{},"{}",[581,1501,1502],{},"không",[581,1504,1505],{},"{2 → 0}",[561,1507,1508,1510,1512,1514,1516,1525],{},[581,1509,585],{},[581,1511,1496],{},[581,1513,1493],{},[581,1515,1505],{},[581,1517,1518,1521,1522],{},[442,1519,1520],{},"CÓ"," (2 ở map, index 0) → return ",[752,1523,1524],{},"0, 1",[581,1526,1030],{},[498,1528,1530],{"id":1529},"_36-step-6-code","3.6. Step 6 — Code",[743,1532,1534],{"className":745,"code":1533,"language":747,"meta":748,"style":748},"public int[] TwoSum(int[] nums, int target) {\n    var map = new Dictionary\u003Cint, int>();        \u002F\u002F value → index\n    for (int i = 0; i \u003C nums.Length; i++) {\n        int complement = target - nums[i];\n        if (map.TryGetValue(complement, out int j)) {\n            return new[] { j, i };               \u002F\u002F j tìm thấy trước i\n        }\n        map[nums[i]] = i;                        \u002F\u002F chưa thấy → lưu\n    }\n    return Array.Empty\u003Cint>();\n}\n",[592,1535,1536,1541,1546,1550,1555,1560,1565,1569,1574,1578,1582],{"__ignoreMap":748},[752,1537,1538],{"class":754,"line":755},[752,1539,1540],{},"public int[] TwoSum(int[] nums, int target) {\n",[752,1542,1543],{"class":754,"line":761},[752,1544,1545],{},"    var map = new Dictionary\u003Cint, int>();        \u002F\u002F value → index\n",[752,1547,1548],{"class":754,"line":767},[752,1549,1340],{},[752,1551,1552],{"class":754,"line":773},[752,1553,1554],{},"        int complement = target - nums[i];\n",[752,1556,1557],{"class":754,"line":779},[752,1558,1559],{},"        if (map.TryGetValue(complement, out int j)) {\n",[752,1561,1562],{"class":754,"line":814},[752,1563,1564],{},"            return new[] { j, i };               \u002F\u002F j tìm thấy trước i\n",[752,1566,1567],{"class":754,"line":819},[752,1568,1365],{},[752,1570,1571],{"class":754,"line":985},[752,1572,1573],{},"        map[nums[i]] = i;                        \u002F\u002F chưa thấy → lưu\n",[752,1575,1576],{"class":754,"line":1372},[752,1577,811],{},[752,1579,1580],{"class":754,"line":1378},[752,1581,1375],{},[752,1583,1585],{"class":754,"line":1584},11,[752,1586,776],{},[498,1588,1590],{"id":1589},"_37-step-7-complexity","3.7. Step 7 — Complexity",[436,1592,1593,1599],{},[439,1594,1595,1598],{},[442,1596,1597],{},"Time: O(n)"," — duyệt mảng 1 lần. Mỗi thao tác HashMap (TryGetValue, set) là O(1) trung bình.",[439,1600,1601,1604],{},[442,1602,1603],{},"Space: O(n)"," — map có thể chứa tới n entry trong worst case.",[498,1606,1608],{"id":1607},"_38-step-8-edge-cases","3.8. Step 8 — Edge cases",[436,1610,1611,1617,1620,1633,1640],{},[439,1612,1613,1614],{},"Mảng rỗng → return empty. ",[476,1615,1616],{},"Đề bảo đảm có solution, nhưng code an toàn vẫn return empty.",[439,1618,1619],{},"1 phần tử → không có cặp → return empty.",[439,1621,1622,1623,1625,1626,1629,1630,1632],{},"2 phần tử trùng (",[592,1624,1295],{},", target 6) → vòng đầu i=0, lưu ",[592,1627,1628],{},"3 → 0",". Vòng 2 i=1, complement=3, map có → return ",[592,1631,1263],{},". ✅",[439,1634,1635,1636,1639],{},"Số âm (",[592,1637,1638],{},"[-3, 4, 3, 90]",", target 0) → tương tự. ✅",[439,1641,1642,1643,1646,1647,1650],{},"Overflow: nếu nums có giá trị cực lớn, ",[592,1644,1645],{},"target - nums[i]"," có thể overflow ",[592,1648,1649],{},"int",". Trong LeetCode, đề thường giới hạn → không cần lo, nhưng nói được điểm là plus.",[498,1652,1654],{"id":1653},"_39-follow-up-interviewer-hay-hỏi","3.9. Follow-up interviewer hay hỏi",[465,1656,1658],{"color":683,"icon":1657},"i-lucide-help-circle",[691,1659,1660,1666,1714,1720],{},[439,1661,1662,1665],{},[476,1663,1664],{},"\"Big O của giải pháp em?\""," → \"O(n) time, O(n) space.\"",[439,1667,1668,702,1671,1674,1675],{},[476,1669,1670],{},"\"Nếu mảng đã sorted, có thể tối ưu space không?\"",[442,1672,1673],{},"Two pointers, O(1) space",":\n",[743,1676,1678],{"className":745,"code":1677,"language":747,"meta":748,"style":748},"int l = 0, r = nums.Length - 1;\nwhile (l \u003C r) {\n    int sum = nums[l] + nums[r];\n    if (sum == target) return new[] { l, r };\n    if (sum \u003C target) l++;\n    else r--;\n}\n",[592,1679,1680,1685,1690,1695,1700,1705,1710],{"__ignoreMap":748},[752,1681,1682],{"class":754,"line":755},[752,1683,1684],{},"int l = 0, r = nums.Length - 1;\n",[752,1686,1687],{"class":754,"line":761},[752,1688,1689],{},"while (l \u003C r) {\n",[752,1691,1692],{"class":754,"line":767},[752,1693,1694],{},"    int sum = nums[l] + nums[r];\n",[752,1696,1697],{"class":754,"line":773},[752,1698,1699],{},"    if (sum == target) return new[] { l, r };\n",[752,1701,1702],{"class":754,"line":779},[752,1703,1704],{},"    if (sum \u003C target) l++;\n",[752,1706,1707],{"class":754,"line":814},[752,1708,1709],{},"    else r--;\n",[752,1711,1712],{"class":754,"line":819},[752,1713,776],{},[439,1715,1716,1719],{},[476,1717,1718],{},"\"Trả về tất cả các cặp thay vì 1?\""," → cần dedupe + tiếp tục duyệt sau khi tìm thấy.",[439,1721,1722,1725],{},[476,1723,1724],{},"\"3 Sum, 4 Sum?\""," → fix 1 hoặc 2 phần tử ngoài, two pointer cho phần còn lại.",[465,1727,1728,1739,1753],{"color":683,"icon":1196},[432,1729,1730,1731,1734,1735,1738],{},"🟡 ",[442,1732,1733],{},"Pattern hashmap \"lookup + iterate\":"," Two Sum là ",[442,1736,1737],{},"prototype"," của pattern này. Áp dụng được cho:",[436,1740,1741,1744,1747,1750],{},[439,1742,1743],{},"Contains Duplicate",[439,1745,1746],{},"Group Anagrams",[439,1748,1749],{},"First Unique Character",[439,1751,1752],{},"Subarray Sum Equals K",[432,1754,1755,1756],{},"Khi gặp bài \"tìm cặp \u002F tìm element thoả điều kiện trên 1 mảng\", phản xạ đầu tiên: ",[476,1757,1758],{},"\"HashMap được không?\"",[491,1760],{},[427,1762,1764],{"id":1763},"_4-bài-2-valid-parentheses-lc-20-pattern-stack","4. Bài 2 — Valid Parentheses (LC 20) — pattern Stack",[498,1766,1768],{"id":1767},"_41-understand-clarify","4.1. Understand + Clarify",[432,1770,1771,1773,1774,1777,1778,1781],{},[442,1772,1230],{}," Cho chuỗi ",[592,1775,1776],{},"s"," chỉ chứa ",[592,1779,1780],{},"()[]{}",". Kiểm tra parentheses hợp lệ — mở phải đóng đúng loại và đúng thứ tự.",[432,1783,1784],{},[442,1785,1252],{},[436,1787,1788,1794,1799,1805,1811],{},[439,1789,1790,1793],{},[592,1791,1792],{},"\"()\""," → true.",[439,1795,1796,1793],{},[592,1797,1798],{},"\"()[]{}\"",[439,1800,1801,1804],{},[592,1802,1803],{},"\"(]\""," → false (sai loại).",[439,1806,1807,1810],{},[592,1808,1809],{},"\"([)]\""," → false (sai thứ tự).",[439,1812,1813,1816],{},[592,1814,1815],{},"\"\""," → true (empty hợp lệ).",[432,1818,1819,1822,1823,1825],{},[442,1820,1821],{},"Clarify:"," chuỗi có ký tự khác ",[592,1824,1780],{}," không? — Đề nói không.",[498,1827,1829],{"id":1828},"_42-brute-force","4.2. Brute force",[432,1831,1832,1834,1835,1256,1838,1256,1841,1843],{},[442,1833,1317],{}," thay liên tục ",[592,1836,1837],{},"()",[592,1839,1840],{},"[]",[592,1842,1499],{}," bằng rỗng cho đến khi không thay được. Nếu chuỗi rỗng cuối → hợp lệ.",[743,1845,1847],{"className":745,"code":1846,"language":747,"meta":748,"style":748},"public bool IsValidBrute(string s) {\n    while (s.Contains(\"()\") || s.Contains(\"[]\") || s.Contains(\"{}\")) {\n        s = s.Replace(\"()\", \"\").Replace(\"[]\", \"\").Replace(\"{}\", \"\");\n    }\n    return s.Length == 0;\n}\n",[592,1848,1849,1854,1859,1864,1868,1873],{"__ignoreMap":748},[752,1850,1851],{"class":754,"line":755},[752,1852,1853],{},"public bool IsValidBrute(string s) {\n",[752,1855,1856],{"class":754,"line":761},[752,1857,1858],{},"    while (s.Contains(\"()\") || s.Contains(\"[]\") || s.Contains(\"{}\")) {\n",[752,1860,1861],{"class":754,"line":767},[752,1862,1863],{},"        s = s.Replace(\"()\", \"\").Replace(\"[]\", \"\").Replace(\"{}\", \"\");\n",[752,1865,1866],{"class":754,"line":773},[752,1867,811],{},[752,1869,1870],{"class":754,"line":779},[752,1871,1872],{},"    return s.Length == 0;\n",[752,1874,1875],{"class":754,"line":814},[752,1876,776],{},[432,1878,1879,1881],{},[442,1880,1385],{}," O(n²) hoặc tệ hơn vì mỗi replace là O(n).",[498,1883,1885],{"id":1884},"_43-optimize-stack","4.3. Optimize — Stack",[432,1887,1888,1890,1891,1894,1895,1898],{},[442,1889,1400],{}," parentheses lồng nhau giống ",[442,1892,1893],{},"chồng đĩa"," — đóng phải khớp với mở ",[442,1896,1897],{},"gần nhất",". Đó chính là Stack (LIFO).",[432,1900,1901],{},[442,1902,1418],{},[691,1904,1905,1908,1921,1934],{},[439,1906,1907],{},"Duyệt từng ký tự.",[439,1909,1910,1911,1256,1914,1256,1917,1920],{},"Nếu là mở (",[592,1912,1913],{},"(",[592,1915,1916],{},"[",[592,1918,1919],{},"{",") → push vào stack.",[439,1922,1923,1924,1256,1927,1256,1930,1933],{},"Nếu là đóng (",[592,1925,1926],{},")",[592,1928,1929],{},"]",[592,1931,1932],{},"}",") → pop khỏi stack và check khớp.",[439,1935,1936],{},"Cuối: stack phải rỗng.",[498,1938,1940],{"id":1939},"_44-dry-run","4.4. Dry run",[432,1942,1943,1422],{},[592,1944,1945],{},"s = \"([])\"",[555,1947,1948,1963],{},[558,1949,1950],{},[561,1951,1952,1954,1957,1960],{},[564,1953,1466],{},[564,1955,1956],{},"char",[564,1958,1959],{},"action",[564,1961,1962],{},"stack",[576,1964,1965,1981,1996,2017],{},[561,1966,1967,1969,1973,1976],{},[581,1968,1490],{},[581,1970,1971],{},[592,1972,1913],{},[581,1974,1975],{},"push",[581,1977,1978],{},[592,1979,1980],{},"[ ( ]",[561,1982,1983,1985,1989,1991],{},[581,1984,585],{},[581,1986,1987],{},[592,1988,1916],{},[581,1990,1975],{},[581,1992,1993],{},[592,1994,1995],{},"[ (, [ ]",[561,1997,1998,2000,2004,2013],{},[581,1999,1493],{},[581,2001,2002],{},[592,2003,1929],{},[581,2005,2006,2007,2009,2010,2012],{},"pop ",[592,2008,1916],{},", khớp ",[592,2011,1929],{},"? ✅",[581,2014,2015],{},[592,2016,1980],{},[561,2018,2019,2022,2026,2032],{},[581,2020,2021],{},"3",[581,2023,2024],{},[592,2025,1926],{},[581,2027,2006,2028,2009,2030,2012],{},[592,2029,1913],{},[592,2031,1926],{},[581,2033,2034],{},[592,2035,2036],{},"[ ]",[432,2038,2039],{},"End: stack rỗng → ✅ valid.",[432,2041,2042,1422],{},[592,2043,2044],{},"s = \"(]\"",[555,2046,2047,2059],{},[558,2048,2049],{},[561,2050,2051,2053,2055,2057],{},[564,2052,1466],{},[564,2054,1956],{},[564,2056,1959],{},[564,2058,1962],{},[576,2060,2061,2075],{},[561,2062,2063,2065,2069,2071],{},[581,2064,1490],{},[581,2066,2067],{},[592,2068,1913],{},[581,2070,1975],{},[581,2072,2073],{},[592,2074,1980],{},[561,2076,2077,2079,2083,2090],{},[581,2078,585],{},[581,2080,2081],{},[592,2082,1929],{},[581,2084,2006,2085,2009,2087,2089],{},[592,2086,1913],{},[592,2088,1929],{},"? ❌",[581,2091,2092],{},"– return false",[498,2094,2096],{"id":2095},"_45-code","4.5. Code",[743,2098,2100],{"className":745,"code":2099,"language":747,"meta":748,"style":748},"public bool IsValid(string s) {\n    var stack = new Stack\u003Cchar>();\n    var pairs = new Dictionary\u003Cchar, char> {\n        { ')', '(' },\n        { ']', '[' },\n        { '}', '{' }\n    };\n    \n    foreach (var c in s) {\n        if (pairs.ContainsValue(c)) {\n            \u002F\u002F ký tự mở → push\n            stack.Push(c);\n        }\n        else if (pairs.TryGetValue(c, out char expectedOpen)) {\n            \u002F\u002F ký tự đóng → check\n            if (stack.Count == 0 || stack.Pop() != expectedOpen) {\n                return false;\n            }\n        }\n    }\n    \n    return stack.Count == 0;        \u002F\u002F còn ký tự mở chưa đóng?\n}\n",[592,2101,2102,2107,2112,2117,2122,2127,2132,2137,2142,2147,2152,2157,2163,2168,2174,2180,2186,2192,2197,2202,2207,2212,2218],{"__ignoreMap":748},[752,2103,2104],{"class":754,"line":755},[752,2105,2106],{},"public bool IsValid(string s) {\n",[752,2108,2109],{"class":754,"line":761},[752,2110,2111],{},"    var stack = new Stack\u003Cchar>();\n",[752,2113,2114],{"class":754,"line":767},[752,2115,2116],{},"    var pairs = new Dictionary\u003Cchar, char> {\n",[752,2118,2119],{"class":754,"line":773},[752,2120,2121],{},"        { ')', '(' },\n",[752,2123,2124],{"class":754,"line":779},[752,2125,2126],{},"        { ']', '[' },\n",[752,2128,2129],{"class":754,"line":814},[752,2130,2131],{},"        { '}', '{' }\n",[752,2133,2134],{"class":754,"line":819},[752,2135,2136],{},"    };\n",[752,2138,2139],{"class":754,"line":985},[752,2140,2141],{},"    \n",[752,2143,2144],{"class":754,"line":1372},[752,2145,2146],{},"    foreach (var c in s) {\n",[752,2148,2149],{"class":754,"line":1378},[752,2150,2151],{},"        if (pairs.ContainsValue(c)) {\n",[752,2153,2154],{"class":754,"line":1584},[752,2155,2156],{},"            \u002F\u002F ký tự mở → push\n",[752,2158,2160],{"class":754,"line":2159},12,[752,2161,2162],{},"            stack.Push(c);\n",[752,2164,2166],{"class":754,"line":2165},13,[752,2167,1365],{},[752,2169,2171],{"class":754,"line":2170},14,[752,2172,2173],{},"        else if (pairs.TryGetValue(c, out char expectedOpen)) {\n",[752,2175,2177],{"class":754,"line":2176},15,[752,2178,2179],{},"            \u002F\u002F ký tự đóng → check\n",[752,2181,2183],{"class":754,"line":2182},16,[752,2184,2185],{},"            if (stack.Count == 0 || stack.Pop() != expectedOpen) {\n",[752,2187,2189],{"class":754,"line":2188},17,[752,2190,2191],{},"                return false;\n",[752,2193,2195],{"class":754,"line":2194},18,[752,2196,1360],{},[752,2198,2200],{"class":754,"line":2199},19,[752,2201,1365],{},[752,2203,2205],{"class":754,"line":2204},20,[752,2206,811],{},[752,2208,2210],{"class":754,"line":2209},21,[752,2211,2141],{},[752,2213,2215],{"class":754,"line":2214},22,[752,2216,2217],{},"    return stack.Count == 0;        \u002F\u002F còn ký tự mở chưa đóng?\n",[752,2219,2221],{"class":754,"line":2220},23,[752,2222,776],{},[498,2224,2226],{"id":2225},"_46-complexity","4.6. Complexity",[436,2228,2229,2234],{},[439,2230,2231,2233],{},[442,2232,1597],{}," — duyệt chuỗi 1 lần, mỗi thao tác stack O(1).",[439,2235,2236,2238,2239,2242],{},[442,2237,1603],{}," — worst case ",[592,2240,2241],{},"\"((((((\""," — toàn ký tự mở, stack chứa n.",[498,2244,2246],{"id":2245},"_47-edge-cases","4.7. Edge cases",[436,2248,2249,2254,2260,2266,2271],{},[439,2250,2251,2253],{},[592,2252,1815],{}," (rỗng) → loop không chạy, stack rỗng → return true. ✅",[439,2255,2256,2259],{},[592,2257,2258],{},"\")\""," (chỉ đóng) → pop khi stack rỗng → return false. ✅",[439,2261,2262,2265],{},[592,2263,2264],{},"\"(\""," (chỉ mở) → loop push, end stack có 1 → return false. ✅",[439,2267,2268,2270],{},[592,2269,2241],{}," → toàn push, stack chứa hết → return false. ✅",[439,2272,2273,2274,2277],{},"Hỗn hợp ",[592,2275,2276],{},"\"({})[]\""," → đan xen vẫn OK miễn match đúng cặp.",[498,2279,2281],{"id":2280},"_48-follow-up","4.8. Follow-up",[465,2283,2284],{"color":683,"icon":1657},[691,2285,2286,2295,2301],{},[439,2287,2288,2294],{},[476,2289,2290,2291,2293],{},"\"Nếu có ký tự khác không phải ",[592,2292,1780],{}," thì sao?\""," → Skip hoặc fail tuỳ yêu cầu. Hỏi clarify.",[439,2296,2297,2300],{},[476,2298,2299],{},"\"Generate parentheses (LC 22)?\""," → Backtracking.",[439,2302,2303,2306],{},[476,2304,2305],{},"\"Sinh chuỗi với min add để valid?\""," → Đếm open chưa match + close không match.",[465,2308,2309,2323],{"color":683,"icon":1196},[432,2310,1730,2311,2314,2315,2318,2319,2322],{},[442,2312,2313],{},"Pattern Stack:"," dùng khi cần ",[442,2316,2317],{},"track \"thứ tự ngược\""," hoặc ",[442,2320,2321],{},"match gần nhất",". Ngoài Valid Parentheses:",[436,2324,2325,2328,2331,2334],{},[439,2326,2327],{},"Min Stack",[439,2329,2330],{},"Daily Temperatures (next greater)",[439,2332,2333],{},"Largest Rectangle in Histogram",[439,2335,2336],{},"Decode String",[491,2338],{},[427,2340,2342],{"id":2341},"_5-bài-3-reverse-linked-list-lc-206-pattern-3-con-trỏ","5. Bài 3 — Reverse Linked List (LC 206) — pattern 3 con trỏ",[498,2344,2346],{"id":2345},"_51-khái-niệm-linked-list","5.1. Khái niệm Linked List",[743,2348,2350],{"className":745,"code":2349,"language":747,"meta":748,"style":748},"public class ListNode {\n    public int Val;\n    public ListNode? Next;\n    public ListNode(int v = 0, ListNode? n = null) { Val = v; Next = n; }\n}\n",[592,2351,2352,2357,2362,2367,2372],{"__ignoreMap":748},[752,2353,2354],{"class":754,"line":755},[752,2355,2356],{},"public class ListNode {\n",[752,2358,2359],{"class":754,"line":761},[752,2360,2361],{},"    public int Val;\n",[752,2363,2364],{"class":754,"line":767},[752,2365,2366],{},"    public ListNode? Next;\n",[752,2368,2369],{"class":754,"line":773},[752,2370,2371],{},"    public ListNode(int v = 0, ListNode? n = null) { Val = v; Next = n; }\n",[752,2373,2374],{"class":754,"line":779},[752,2375,776],{},[432,2377,2378],{},"Linked list = chuỗi node, mỗi node có giá trị + con trỏ Next. Hình dung:",[743,2380,2383],{"className":2381,"code":2382,"language":1210},[1208],"head → [1|*] → [2|*] → [3|*] → [4|null]\n",[592,2384,2382],{"__ignoreMap":748},[498,2386,2388],{"id":2387},"_52-understand-clarify","5.2. Understand + Clarify",[432,2390,2391,2393],{},[442,2392,1230],{}," đảo ngược linked list. Trả head mới.",[432,2395,2396,2399,2400,489],{},[592,2397,2398],{},"1 → 2 → 3 → 4 → null"," thành ",[592,2401,2402],{},"4 → 3 → 2 → 1 → null",[498,2404,2406],{"id":2405},"_53-suy-nghĩ","5.3. Suy nghĩ",[432,2408,2409,2411,2412,2415],{},[442,2410,1400],{}," với mỗi node, đổi ",[592,2413,2414],{},"Next"," trỏ ngược về node trước. Cần track 3 thứ:",[436,2417,2418,2424,2430],{},[439,2419,2420,2423],{},[592,2421,2422],{},"prev"," — node trước (lúc đầu null vì head không có trước).",[439,2425,2426,2429],{},[592,2427,2428],{},"curr"," — node hiện tại đang xử lý.",[439,2431,2432,2435],{},[592,2433,2434],{},"next"," — lưu Next để không mất sau khi đổi.",[498,2437,2439],{"id":2438},"_54-dry-run","5.4. Dry run",[432,2441,2442,1422],{},[592,2443,2444],{},"1 → 2 → 3 → null",[743,2446,2449],{"className":2447,"code":2448,"language":1210},[1208],"Bước 0: prev=null, curr=1\n  next = 2\n  curr.Next = prev (= null)\n  → 1 → null\n  prev = 1, curr = 2\n\nBước 1: prev=1, curr=2\n  next = 3\n  curr.Next = prev (= 1)\n  → 2 → 1 → null\n  prev = 2, curr = 3\n\nBước 2: prev=2, curr=3\n  next = null\n  curr.Next = prev (= 2)\n  → 3 → 2 → 1 → null\n  prev = 3, curr = null\n\nLoop kết thúc (curr == null). Return prev = 3.\n",[592,2450,2448],{"__ignoreMap":748},[498,2452,2454],{"id":2453},"_55-code","5.5. Code",[743,2456,2458],{"className":745,"code":2457,"language":747,"meta":748,"style":748},"public ListNode? Reverse(ListNode? head) {\n    ListNode? prev = null;\n    ListNode? curr = head;\n    \n    while (curr != null) {\n        ListNode? next = curr.Next;     \u002F\u002F 1. lưu next trước khi mất\n        curr.Next = prev;                \u002F\u002F 2. đảo ngược con trỏ\n        prev = curr;                     \u002F\u002F 3. dịch prev tiến\n        curr = next;                     \u002F\u002F 4. dịch curr tiến\n    }\n    \n    return prev;        \u002F\u002F prev cuối cùng = head mới\n}\n",[592,2459,2460,2465,2470,2475,2479,2484,2489,2494,2499,2504,2508,2512,2517],{"__ignoreMap":748},[752,2461,2462],{"class":754,"line":755},[752,2463,2464],{},"public ListNode? Reverse(ListNode? head) {\n",[752,2466,2467],{"class":754,"line":761},[752,2468,2469],{},"    ListNode? prev = null;\n",[752,2471,2472],{"class":754,"line":767},[752,2473,2474],{},"    ListNode? curr = head;\n",[752,2476,2477],{"class":754,"line":773},[752,2478,2141],{},[752,2480,2481],{"class":754,"line":779},[752,2482,2483],{},"    while (curr != null) {\n",[752,2485,2486],{"class":754,"line":814},[752,2487,2488],{},"        ListNode? next = curr.Next;     \u002F\u002F 1. lưu next trước khi mất\n",[752,2490,2491],{"class":754,"line":819},[752,2492,2493],{},"        curr.Next = prev;                \u002F\u002F 2. đảo ngược con trỏ\n",[752,2495,2496],{"class":754,"line":985},[752,2497,2498],{},"        prev = curr;                     \u002F\u002F 3. dịch prev tiến\n",[752,2500,2501],{"class":754,"line":1372},[752,2502,2503],{},"        curr = next;                     \u002F\u002F 4. dịch curr tiến\n",[752,2505,2506],{"class":754,"line":1378},[752,2507,811],{},[752,2509,2510],{"class":754,"line":1584},[752,2511,2141],{},[752,2513,2514],{"class":754,"line":2159},[752,2515,2516],{},"    return prev;        \u002F\u002F prev cuối cùng = head mới\n",[752,2518,2519],{"class":754,"line":2165},[752,2520,776],{},[498,2522,2524],{"id":2523},"_56-complexity","5.6. Complexity",[436,2526,2527,2532],{},[439,2528,2529,2531],{},[442,2530,1597],{}," — đi qua mỗi node 1 lần.",[439,2533,2534,2537],{},[442,2535,2536],{},"Space: O(1)"," — chỉ dùng 3 biến.",[498,2539,2541],{"id":2540},"_57-edge-cases","5.7. Edge cases",[436,2543,2544,2547,2550],{},[439,2545,2546],{},"Empty list (head = null) → loop không chạy, return null. ✅",[439,2548,2549],{},"1 node → loop 1 lần, next = null, curr.Next = null (đã thế), prev = node, curr = null → return node. ✅",[439,2551,2552],{},"2 node → loop 2 lần đúng. ✅",[498,2554,2556],{"id":2555},"_58-follow-up","5.8. Follow-up",[691,2558,2559],{},[439,2560,2561,2564],{},[476,2562,2563],{},"\"Đệ quy?\""," — Có:",[743,2566,2568],{"className":745,"code":2567,"language":747,"meta":748,"style":748},"public ListNode? ReverseRec(ListNode? head) {\n    if (head == null || head.Next == null) return head;\n    var rest = ReverseRec(head.Next);\n    head.Next.Next = head;        \u002F\u002F đảo\n    head.Next = null;\n    return rest;\n}\n",[592,2569,2570,2575,2580,2585,2590,2595,2600],{"__ignoreMap":748},[752,2571,2572],{"class":754,"line":755},[752,2573,2574],{},"public ListNode? ReverseRec(ListNode? head) {\n",[752,2576,2577],{"class":754,"line":761},[752,2578,2579],{},"    if (head == null || head.Next == null) return head;\n",[752,2581,2582],{"class":754,"line":767},[752,2583,2584],{},"    var rest = ReverseRec(head.Next);\n",[752,2586,2587],{"class":754,"line":773},[752,2588,2589],{},"    head.Next.Next = head;        \u002F\u002F đảo\n",[752,2591,2592],{"class":754,"line":779},[752,2593,2594],{},"    head.Next = null;\n",[752,2596,2597],{"class":754,"line":814},[752,2598,2599],{},"    return rest;\n",[752,2601,2602],{"class":754,"line":819},[752,2603,776],{},[432,2605,2606],{},"Space O(n) do call stack. Iterative tốt hơn.",[691,2608,2609,2615],{"start":761},[439,2610,2611,2614],{},[476,2612,2613],{},"\"Đảo k node một (LC 25)?\""," — kết hợp đảo + đếm.",[439,2616,2617,2620],{},[476,2618,2619],{},"\"Đảo từ vị trí m đến n (LC 92)?\""," — find m và n, đảo trong đoạn.",[465,2622,2623,2629],{"color":683,"icon":1196},[432,2624,1730,2625,2628],{},[442,2626,2627],{},"Pattern 2-3 con trỏ trên Linked List:"," áp dụng cho:",[436,2630,2631,2634,2637,2640],{},[439,2632,2633],{},"Reverse Linked List",[439,2635,2636],{},"Detect Cycle (Floyd tortoise & hare)",[439,2638,2639],{},"Find Middle (slow & fast)",[439,2641,2642],{},"Remove Nth From End (2 pointer cách N)",[491,2644],{},[427,2646,2648],{"id":2647},"_6-bài-4-binary-search-lc-704-pattern-divide-conquer","6. Bài 4 — Binary Search (LC 704) — pattern Divide & Conquer",[498,2650,2652],{"id":2651},"_61-khái-niệm","6.1. Khái niệm",[465,2654,2655,2669],{"color":467,"icon":468},[432,2656,506,2657,2660,2661,2664,2665,2668],{},[442,2658,2659],{},"Binary Search"," chỉ hoạt động trên mảng ",[442,2662,2663],{},"đã SORTED",". Mỗi bước ",[442,2666,2667],{},"chia đôi"," không gian tìm kiếm → O(log n).",[432,2670,2671],{},"Hình dung: đoán số 1 đến 100 (đối phương có số n). Đoán 50, biết lớn hoặc nhỏ → loại 1 nửa. Mỗi lần đoán: gấp đôi tốc độ.",[498,2673,2675],{"id":2674},"_62-đề-suy-nghĩ","6.2. Đề + suy nghĩ",[432,2677,2678,2680,2681,2683,2684,2687],{},[442,2679,1230],{}," mảng sorted ",[592,2682,1469],{},", tìm ",[592,2685,2686],{},"target",". Trả index hoặc -1.",[432,2689,2690],{},[442,2691,1418],{},[691,2693,2694,2704,2710,2734],{},[439,2695,2696,2699,2700,2703],{},[592,2697,2698],{},"l"," = 0, ",[592,2701,2702],{},"r"," = length - 1.",[439,2705,2706,2709],{},[592,2707,2708],{},"mid"," = (l + r) \u002F 2.",[439,2711,2712,2713,2716,2717],{},"So sánh ",[592,2714,2715],{},"nums[mid]"," với target:\n",[436,2718,2719,2722,2728],{},[439,2720,2721],{},"bằng → return mid.",[439,2723,2724,2725,489],{},"bé hơn target → target ở nửa phải → ",[592,2726,2727],{},"l = mid + 1",[439,2729,2730,2731,489],{},"lớn hơn → nửa trái → ",[592,2732,2733],{},"r = mid - 1",[439,2735,2736,2737,489],{},"Loop tới ",[592,2738,2739],{},"l > r",[498,2741,2743],{"id":2742},"_63-dry-run","6.3. Dry run",[432,2745,2746,1256,2749,1422],{},[592,2747,2748],{},"nums = [-1, 0, 3, 5, 9, 12]",[592,2750,1259],{},[555,2752,2753,2775],{},[558,2754,2755],{},[561,2756,2757,2760,2762,2764,2766,2770,2773],{},[564,2758,2759],{},"Bước",[564,2761,2698],{},[564,2763,2702],{},[564,2765,2708],{},[564,2767,1469,2768],{},[752,2769,2708],{},[564,2771,2772],{},"so target=9",[564,2774,1959],{},[576,2776,2777,2796],{},[561,2778,2779,2781,2783,2786,2788,2790,2793],{},[581,2780,585],{},[581,2782,1490],{},[581,2784,2785],{},"5",[581,2787,1493],{},[581,2789,2021],{},[581,2791,2792],{},"bé",[581,2794,2795],{},"l = 3",[561,2797,2798,2800,2802,2804,2807,2810,2813],{},[581,2799,1493],{},[581,2801,2021],{},[581,2803,2785],{},[581,2805,2806],{},"4",[581,2808,2809],{},"9",[581,2811,2812],{},"bằng",[581,2814,2815],{},"return 4",[432,2817,2818,1422],{},[592,2819,2820],{},"target = 2",[555,2822,2823,2844],{},[558,2824,2825],{},[561,2826,2827,2829,2831,2833,2835,2839,2842],{},[564,2828,2759],{},[564,2830,2698],{},[564,2832,2702],{},[564,2834,2708],{},[564,2836,1469,2837],{},[752,2838,2708],{},[564,2840,2841],{},"so",[564,2843,1959],{},[576,2845,2846,2864,2882],{},[561,2847,2848,2850,2852,2854,2856,2858,2861],{},[581,2849,585],{},[581,2851,1490],{},[581,2853,2785],{},[581,2855,1493],{},[581,2857,2021],{},[581,2859,2860],{},"lớn",[581,2862,2863],{},"r = 1",[561,2865,2866,2868,2870,2872,2874,2877,2879],{},[581,2867,1493],{},[581,2869,1490],{},[581,2871,585],{},[581,2873,1490],{},[581,2875,2876],{},"-1",[581,2878,2792],{},[581,2880,2881],{},"l = 1",[561,2883,2884,2886,2888,2890,2892,2894,2896],{},[581,2885,2021],{},[581,2887,585],{},[581,2889,585],{},[581,2891,585],{},[581,2893,1490],{},[581,2895,2792],{},[581,2897,2898],{},"l = 2",[432,2900,2901],{},"l > r → return -1.",[498,2903,2905],{"id":2904},"_64-code","6.4. Code",[743,2907,2909],{"className":745,"code":2908,"language":747,"meta":748,"style":748},"public int Search(int[] nums, int target) {\n    int l = 0, r = nums.Length - 1;\n    \n    while (l \u003C= r) {\n        int mid = l + (r - l) \u002F 2;       \u002F\u002F ⚠ tránh overflow (l+r)\u002F2 với int lớn\n        \n        if (nums[mid] == target) return mid;\n        if (nums[mid] \u003C target) l = mid + 1;\n        else r = mid - 1;\n    }\n    \n    return -1;\n}\n",[592,2910,2911,2916,2921,2925,2930,2935,2940,2945,2950,2955,2959,2963,2968],{"__ignoreMap":748},[752,2912,2913],{"class":754,"line":755},[752,2914,2915],{},"public int Search(int[] nums, int target) {\n",[752,2917,2918],{"class":754,"line":761},[752,2919,2920],{},"    int l = 0, r = nums.Length - 1;\n",[752,2922,2923],{"class":754,"line":767},[752,2924,2141],{},[752,2926,2927],{"class":754,"line":773},[752,2928,2929],{},"    while (l \u003C= r) {\n",[752,2931,2932],{"class":754,"line":779},[752,2933,2934],{},"        int mid = l + (r - l) \u002F 2;       \u002F\u002F ⚠ tránh overflow (l+r)\u002F2 với int lớn\n",[752,2936,2937],{"class":754,"line":814},[752,2938,2939],{},"        \n",[752,2941,2942],{"class":754,"line":819},[752,2943,2944],{},"        if (nums[mid] == target) return mid;\n",[752,2946,2947],{"class":754,"line":985},[752,2948,2949],{},"        if (nums[mid] \u003C target) l = mid + 1;\n",[752,2951,2952],{"class":754,"line":1372},[752,2953,2954],{},"        else r = mid - 1;\n",[752,2956,2957],{"class":754,"line":1378},[752,2958,811],{},[752,2960,2961],{"class":754,"line":1584},[752,2962,2141],{},[752,2964,2965],{"class":754,"line":2159},[752,2966,2967],{},"    return -1;\n",[752,2969,2970],{"class":754,"line":2165},[752,2971,776],{},[498,2973,2975],{"id":2974},"_65-bẫy-nhỏ-overflow","6.5. Bẫy nhỏ — overflow",[465,2977,2980,2994],{"color":2978,"icon":2979},"error","i-lucide-alert-octagon",[432,2981,1730,2982,2985,2986,2989,2990,2993],{},[592,2983,2984],{},"mid = (l + r) \u002F 2;"," — với l, r là int lớn (gần ",[592,2987,2988],{},"int.MaxValue","), ",[592,2991,2992],{},"l + r"," overflow → mid sai.",[432,2995,2996,2997,3000],{},"→ Dùng ",[592,2998,2999],{},"mid = l + (r - l) \u002F 2;"," luôn an toàn.",[498,3002,3004],{"id":3003},"_66-complexity","6.6. Complexity",[436,3006,3007,3013],{},[439,3008,3009,3012],{},[442,3010,3011],{},"Time: O(log n)"," — mỗi bước chia đôi.",[439,3014,3015,3017],{},[442,3016,2536],{}," iterative; O(log n) nếu đệ quy (call stack).",[498,3019,3021],{"id":3020},"_67-edge-cases","6.7. Edge cases",[436,3023,3024,3027,3030,3033],{},[439,3025,3026],{},"Mảng rỗng → l = 0, r = -1, while không chạy → return -1. ✅",[439,3028,3029],{},"Target nhỏ hơn min hoặc lớn hơn max → loop kết thúc với -1. ✅",[439,3031,3032],{},"1 phần tử bằng target → mid = 0, return 0. ✅",[439,3034,3035],{},"1 phần tử khác target → l > r → -1. ✅",[498,3037,3039],{"id":3038},"_68-follow-up-pattern-binary-search-nâng-cao","6.8. Follow-up — pattern Binary Search nâng cao",[465,3041,3042,3051,3054,3093],{"color":683,"icon":1196},[432,3043,1730,3044,3047,3048,489],{},[442,3045,3046],{},"Binary Search không chỉ tìm số trong mảng sorted."," Pattern thật là ",[476,3049,3050],{},"\"tìm điểm chuyển trạng thái trong không gian monotonic\"",[432,3052,3053],{},"Áp dụng:",[436,3055,3056,3066,3072,3078,3087],{},[439,3057,3058,3061,3062,3065],{},[442,3059,3060],{},"First Bad Version (LC 278):"," tìm lần fail đầu tiên — function check ",[592,3063,3064],{},"IsBad(version)"," monotonic.",[439,3067,3068,3071],{},[442,3069,3070],{},"Search in Rotated Sorted Array (LC 33):"," vẫn binary search được, chỉ thêm bước check nửa nào sorted.",[439,3073,3074,3077],{},[442,3075,3076],{},"Find Peak Element (LC 162):"," so sánh với neighbor.",[439,3079,3080,3083,3084,489],{},[442,3081,3082],{},"Square Root (LC 69):"," binary search trên ",[592,3085,3086],{},"[0, x]",[439,3088,3089,3092],{},[442,3090,3091],{},"Capacity to Ship Within D Days (LC 1011):"," binary search trên không gian \"capacity\".",[432,3094,3095],{},"Khi gặp bài có ý \"tìm giá trị nhỏ nhất\u002Flớn nhất thoả điều kiện X\" và check X là monotonic → nghĩ Binary Search.",[491,3097],{},[427,3099,3101],{"id":3100},"_7-bài-5-maximum-subarray-lc-53-pattern-kadane","7. Bài 5 — Maximum Subarray (LC 53) — pattern Kadane",[498,3103,3105],{"id":3104},"_71-đề","7.1. Đề",[432,3107,3108,3109,2683,3111,3114],{},"Cho ",[592,3110,1234],{},[442,3112,3113],{},"contiguous subarray"," có tổng lớn nhất. Trả tổng đó.",[432,3116,3117,3120,3121,3124],{},[592,3118,3119],{},"nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]"," → subarray ",[592,3122,3123],{},"[4, -1, 2, 1]",", tổng = 6.",[498,3126,3128],{"id":3127},"_72-brute-force","7.2. Brute force",[432,3130,3131],{},"3 vòng lặp: i = start, j = end, sum trong đoạn → O(n³). Tối ưu thành O(n²) bằng cách tính sum tăng dần. Vẫn quá chậm với n lớn.",[498,3133,3135],{"id":3134},"_73-insight-kadanes-algorithm","7.3. Insight — Kadane's algorithm",[465,3137,3138,3147,3150,3169],{"color":683,"icon":268},[432,3139,1730,3140,3143,3144],{},[442,3141,3142],{},"Insight quan trọng:"," với mỗi vị trí i, ta hỏi ",[476,3145,3146],{},"\"subarray kết thúc tại i có tổng lớn nhất là bao nhiêu?\"",[432,3148,3149],{},"2 lựa chọn:",[436,3151,3152,3160],{},[439,3153,3154,3157,3158,489],{},[442,3155,3156],{},"Bắt đầu mới"," tại i → tổng = nums",[752,3159,1466],{},[439,3161,3162,3165,3166,3168],{},[442,3163,3164],{},"Mở rộng"," từ subarray kết thúc tại i-1 → tổng = nums",[752,3167,1466],{}," + best ending at i-1.",[432,3170,3171,3172,3175],{},"Chọn cái lớn hơn. Đây là ",[442,3173,3174],{},"dynamic programming"," ở dạng đơn giản nhất.",[498,3177,3179],{"id":3178},"_74-dry-run","7.4. Dry run",[432,3181,3182,1422],{},[592,3183,3119],{},[555,3185,3186,3202],{},[558,3187,3188],{},[561,3189,3190,3192,3196,3199],{},[564,3191,1466],{},[564,3193,1469,3194],{},[752,3195,1466],{},[564,3197,3198],{},"curr (best ending at i)",[564,3200,3201],{},"best (overall)",[576,3203,3204,3215,3226,3238,3249,3260,3271,3285,3297],{},[561,3205,3206,3208,3211,3213],{},[581,3207,1490],{},[581,3209,3210],{},"-2",[581,3212,3210],{},[581,3214,3210],{},[561,3216,3217,3219,3221,3224],{},[581,3218,585],{},[581,3220,585],{},[581,3222,3223],{},"max(1, -2+1) = 1",[581,3225,585],{},[561,3227,3228,3230,3233,3236],{},[581,3229,1493],{},[581,3231,3232],{},"-3",[581,3234,3235],{},"max(-3, 1-3) = -2",[581,3237,585],{},[561,3239,3240,3242,3244,3247],{},[581,3241,2021],{},[581,3243,2806],{},[581,3245,3246],{},"max(4, -2+4) = 4",[581,3248,2806],{},[561,3250,3251,3253,3255,3258],{},[581,3252,2806],{},[581,3254,2876],{},[581,3256,3257],{},"max(-1, 4-1) = 3",[581,3259,2806],{},[561,3261,3262,3264,3266,3269],{},[581,3263,2785],{},[581,3265,1493],{},[581,3267,3268],{},"max(2, 3+2) = 5",[581,3270,2785],{},[561,3272,3273,3276,3278,3281],{},[581,3274,3275],{},"6",[581,3277,585],{},[581,3279,3280],{},"max(1, 5+1) = 6",[581,3282,3283],{},[442,3284,3275],{},[561,3286,3287,3289,3292,3295],{},[581,3288,1496],{},[581,3290,3291],{},"-5",[581,3293,3294],{},"max(-5, 6-5) = 1",[581,3296,3275],{},[561,3298,3299,3302,3304,3307],{},[581,3300,3301],{},"8",[581,3303,2806],{},[581,3305,3306],{},"max(4, 1+4) = 5",[581,3308,3275],{},[432,3310,3311],{},"Final: 6. ✅",[498,3313,3315],{"id":3314},"_75-code","7.5. Code",[743,3317,3319],{"className":745,"code":3318,"language":747,"meta":748,"style":748},"public int MaxSubArray(int[] nums) {\n    int curr = nums[0];\n    int best = nums[0];\n    \n    for (int i = 1; i \u003C nums.Length; i++) {\n        \u002F\u002F Mở rộng hay bắt đầu mới?\n        curr = Math.Max(nums[i], curr + nums[i]);\n        \u002F\u002F Cập nhật best\n        best = Math.Max(best, curr);\n    }\n    \n    return best;\n}\n",[592,3320,3321,3326,3331,3336,3340,3345,3350,3355,3360,3365,3369,3373,3378],{"__ignoreMap":748},[752,3322,3323],{"class":754,"line":755},[752,3324,3325],{},"public int MaxSubArray(int[] nums) {\n",[752,3327,3328],{"class":754,"line":761},[752,3329,3330],{},"    int curr = nums[0];\n",[752,3332,3333],{"class":754,"line":767},[752,3334,3335],{},"    int best = nums[0];\n",[752,3337,3338],{"class":754,"line":773},[752,3339,2141],{},[752,3341,3342],{"class":754,"line":779},[752,3343,3344],{},"    for (int i = 1; i \u003C nums.Length; i++) {\n",[752,3346,3347],{"class":754,"line":814},[752,3348,3349],{},"        \u002F\u002F Mở rộng hay bắt đầu mới?\n",[752,3351,3352],{"class":754,"line":819},[752,3353,3354],{},"        curr = Math.Max(nums[i], curr + nums[i]);\n",[752,3356,3357],{"class":754,"line":985},[752,3358,3359],{},"        \u002F\u002F Cập nhật best\n",[752,3361,3362],{"class":754,"line":1372},[752,3363,3364],{},"        best = Math.Max(best, curr);\n",[752,3366,3367],{"class":754,"line":1378},[752,3368,811],{},[752,3370,3371],{"class":754,"line":1584},[752,3372,2141],{},[752,3374,3375],{"class":754,"line":2159},[752,3376,3377],{},"    return best;\n",[752,3379,3380],{"class":754,"line":2165},[752,3381,776],{},[498,3383,3385],{"id":3384},"_76-complexity","7.6. Complexity",[436,3387,3388,3393],{},[439,3389,3390,3392],{},[442,3391,1597],{}," — 1 vòng.",[439,3394,3395,3397],{},[442,3396,2536],{}," — 2 biến.",[498,3399,3401],{"id":3400},"_77-edge-cases","7.7. Edge cases",[436,3403,3404,3407,3414],{},[439,3405,3406],{},"Mảng 1 phần tử → return luôn nó.",[439,3408,3409,3410,3413],{},"Mảng toàn âm ",[592,3411,3412],{},"[-3, -1, -5]"," → best = -1 (max trong các phần tử). ✅",[439,3415,3416],{},"Mảng toàn dương → best = tổng cả mảng.",[465,3418,3419,3425],{"color":683,"icon":1196},[432,3420,1730,3421,3424],{},[442,3422,3423],{},"Pattern Kadane (DP 1D):"," \"tại mỗi vị trí, optimal là gì?\". Áp dụng:",[436,3426,3427,3430,3433],{},[439,3428,3429],{},"Max Product Subarray (cẩn thận âm × âm).",[439,3431,3432],{},"Longest Increasing Subsequence (tweak).",[439,3434,3435],{},"House Robber (LC 198).",[491,3437],{},[427,3439,3441],{"id":3440},"_8-bài-6-valid-anagram-lc-242-pattern-frequency-count","8. Bài 6 — Valid Anagram (LC 242) — pattern frequency count",[498,3443,3445],{"id":3444},"_81-đề","8.1. Đề",[432,3447,3448,3449,3452,3453,3456,3457,3459],{},"Cho 2 chuỗi ",[592,3450,3451],{},"s, t",". Check ",[592,3454,3455],{},"t"," có phải anagram của ",[592,3458,1776],{}," không (chứa cùng ký tự với cùng tần suất).",[432,3461,3462,1256,3465,1793],{},[592,3463,3464],{},"s = \"anagram\"",[592,3466,3467],{},"t = \"nagaram\"",[498,3469,3471],{"id":3470},"_82-suy-nghĩ","8.2. Suy nghĩ",[432,3473,3474],{},"3 cách:",[432,3476,3477],{},[442,3478,3479],{},"Cách 1 — Sort + compare:",[743,3481,3483],{"className":745,"code":3482,"language":747,"meta":748,"style":748},"return new string(s.OrderBy(c => c).ToArray()) ==\n       new string(t.OrderBy(c => c).ToArray());\n",[592,3484,3485,3490],{"__ignoreMap":748},[752,3486,3487],{"class":754,"line":755},[752,3488,3489],{},"return new string(s.OrderBy(c => c).ToArray()) ==\n",[752,3491,3492],{"class":754,"line":761},[752,3493,3494],{},"       new string(t.OrderBy(c => c).ToArray());\n",[432,3496,3497],{},"Time O(n log n), Space O(n).",[432,3499,3500],{},[442,3501,3502],{},"Cách 2 — Count + map (Unicode):",[743,3504,3506],{"className":745,"code":3505,"language":747,"meta":748,"style":748},"var count = new Dictionary\u003Cchar, int>();\nforeach (var c in s) count[c] = count.GetValueOrDefault(c) + 1;\nforeach (var c in t) {\n    if (!count.ContainsKey(c) || --count[c] \u003C 0) return false;\n}\nreturn true;\n",[592,3507,3508,3513,3518,3523,3528,3532],{"__ignoreMap":748},[752,3509,3510],{"class":754,"line":755},[752,3511,3512],{},"var count = new Dictionary\u003Cchar, int>();\n",[752,3514,3515],{"class":754,"line":761},[752,3516,3517],{},"foreach (var c in s) count[c] = count.GetValueOrDefault(c) + 1;\n",[752,3519,3520],{"class":754,"line":767},[752,3521,3522],{},"foreach (var c in t) {\n",[752,3524,3525],{"class":754,"line":773},[752,3526,3527],{},"    if (!count.ContainsKey(c) || --count[c] \u003C 0) return false;\n",[752,3529,3530],{"class":754,"line":779},[752,3531,776],{},[752,3533,3534],{"class":754,"line":814},[752,3535,3536],{},"return true;\n",[432,3538,3539],{},"Time O(n), Space O(k).",[432,3541,3542],{},[442,3543,3544],{},"Cách 3 — Count array (chỉ a-z):",[743,3546,3548],{"className":745,"code":3547,"language":747,"meta":748,"style":748},"if (s.Length != t.Length) return false;\nvar cnt = new int[26];\nforeach (var c in s) cnt[c - 'a']++;\nforeach (var c in t) {\n    if (--cnt[c - 'a'] \u003C 0) return false;\n}\nreturn true;\n",[592,3549,3550,3555,3560,3565,3569,3574,3578],{"__ignoreMap":748},[752,3551,3552],{"class":754,"line":755},[752,3553,3554],{},"if (s.Length != t.Length) return false;\n",[752,3556,3557],{"class":754,"line":761},[752,3558,3559],{},"var cnt = new int[26];\n",[752,3561,3562],{"class":754,"line":767},[752,3563,3564],{},"foreach (var c in s) cnt[c - 'a']++;\n",[752,3566,3567],{"class":754,"line":773},[752,3568,3522],{},[752,3570,3571],{"class":754,"line":779},[752,3572,3573],{},"    if (--cnt[c - 'a'] \u003C 0) return false;\n",[752,3575,3576],{"class":754,"line":814},[752,3577,776],{},[752,3579,3580],{"class":754,"line":819},[752,3581,3536],{},[432,3583,3584],{},"Time O(n), Space O(1) (alphabet cố định).",[498,3586,3588],{"id":3587},"_83-optimize-chọn-cách-3","8.3. Optimize chọn cách 3",[432,3590,3591,3594],{},[442,3592,3593],{},"Insight 1:"," length phải bằng nhau → check trước, early return.",[432,3596,3597,3600,3601,3604,3605,3608],{},[442,3598,3599],{},"Insight 2:"," alphabet ",[592,3602,3603],{},"a-z"," có 26 → ",[592,3606,3607],{},"int[26]"," đủ, không cần Dictionary (cấp phát object đắt hơn).",[432,3610,3611,3614,3615,3618,3619,3621,3622,3624],{},[442,3612,3613],{},"Insight 3:"," chỉ cần ",[442,3616,3617],{},"1 vòng tăng cho s và 1 vòng giảm cho t"," → nếu phần tử nào âm tức là ",[592,3620,3455],{}," có ký tự ",[592,3623,1776],{}," không có.",[498,3626,3628],{"id":3627},"_84-dry-run","8.4. Dry run",[432,3630,3631,1256,3634,1422],{},[592,3632,3633],{},"s = \"abc\"",[592,3635,3636],{},"t = \"bca\"",[743,3638,3641],{"className":3639,"code":3640,"language":1210},[1208],"cnt = [0]*26\nSau loop s: cnt['a']=1, cnt['b']=1, cnt['c']=1 → [1,1,1,0,...]\nLoop t:\n  'b': --cnt['b'] → 0, OK.\n  'c': --cnt['c'] → 0, OK.\n  'a': --cnt['a'] → 0, OK.\nEnd → return true.\n",[592,3642,3640],{"__ignoreMap":748},[432,3644,3645,1256,3647,3650,3651,3654],{},[592,3646,3633],{},[592,3648,3649],{},"t = \"abd\"",": length bằng, nhưng vòng t có 'd' chưa có trong s → cnt",[752,3652,3653],{},"'d'"," = -1 \u003C 0 → return false.",[498,3656,3658],{"id":3657},"_85-complexity","8.5. Complexity",[436,3660,3661,3664],{},[439,3662,3663],{},"Time: O(n).",[439,3665,3666],{},"Space: O(1) — array 26 cố định.",[498,3668,3670],{"id":3669},"_86-edge-case","8.6. Edge case",[436,3672,3673,3676,3679],{},[439,3674,3675],{},"Length khác → false.",[439,3677,3678],{},"Empty + empty → loop không chạy, return true.",[439,3680,3681],{},"Có ký tự ngoài a-z → cách này crash. Phải hỏi clarify hoặc dùng Dictionary.",[498,3683,3685],{"id":3684},"_87-follow-up","8.7. Follow-up",[436,3687,3688,3697],{},[439,3689,3690,3693,3694,489],{},[476,3691,3692],{},"\"Unicode (tiếng Việt, emoji)?\""," → Dùng Dictionary thay int",[752,3695,3696],{},"26",[439,3698,3699,3702],{},[476,3700,3701],{},"\"Group Anagrams (LC 49)?\""," → key = chuỗi sorted, group bằng map.",[491,3704],{},[427,3706,3708],{"id":3707},"_9-lộ-trình-leetcode-1-tuần-sau-ngày-6","9. Lộ trình LeetCode 1 tuần (sau ngày 6)",[432,3710,3711,3712,489],{},"Mỗi ngày 2-3 bài Easy, áp dụng framework 8 bước. Đừng chỉ đọc — ",[442,3713,3714],{},"gõ + chạy trong LeetCode",[555,3716,3717,3730],{},[558,3718,3719],{},[561,3720,3721,3724,3727],{},[564,3722,3723],{},"Ngày",[564,3725,3726],{},"Bài",[564,3728,3729],{},"Pattern",[576,3731,3732,3743,3754,3765,3775,3786,3797],{},[561,3733,3734,3737,3740],{},[581,3735,3736],{},"Mon",[581,3738,3739],{},"Two Sum, Best Time to Buy Stock",[581,3741,3742],{},"HashMap, 1-pass tracking",[561,3744,3745,3748,3751],{},[581,3746,3747],{},"Tue",[581,3749,3750],{},"Valid Anagram, Valid Parentheses",[581,3752,3753],{},"Frequency count, Stack",[561,3755,3756,3759,3762],{},[581,3757,3758],{},"Wed",[581,3760,3761],{},"Reverse Linked List, Merge Two Sorted Lists",[581,3763,3764],{},"2-3 con trỏ",[561,3766,3767,3770,3773],{},[581,3768,3769],{},"Thu",[581,3771,3772],{},"Binary Search, First Bad Version",[581,3774,608],{},[561,3776,3777,3780,3783],{},[581,3778,3779],{},"Fri",[581,3781,3782],{},"Maximum Subarray, Move Zeroes",[581,3784,3785],{},"Kadane, Two pointer",[561,3787,3788,3791,3794],{},[581,3789,3790],{},"Sat",[581,3792,3793],{},"Climbing Stairs, Fibonacci",[581,3795,3796],{},"DP 1D cơ bản",[561,3798,3799,3802,3805],{},[581,3800,3801],{},"Sun",[581,3803,3804],{},"Contains Duplicate, Group Anagrams",[581,3806,3807],{},"HashSet, HashMap",[465,3809,3811],{"color":467,"icon":3810},"i-lucide-target",[442,3812,3813,3814,3817],{},"Đến đây bạn đã có pattern. Apply framework 8 bước cho mọi bài. Sau 20-30 bài, bạn sẽ ",[442,3815,3816],{},"nhận diện pattern"," trong vài giây — đó là level junior+.",[491,3819],{},[427,3821,3823],{"id":3822},"_10-câu-hỏi-tự-test-cuối-ngày","10. Câu hỏi tự test cuối ngày",[465,3825,3826,3831,3842,3852,3858],{"color":467,"icon":1657},[432,3827,3828],{},[442,3829,3830],{},"🟢 Intern:",[691,3832,3833,3836,3839],{},[439,3834,3835],{},"Big O là gì? Cho 1 ví dụ code O(n²).",[439,3837,3838],{},"Stack vs Queue khác nhau ra sao?",[439,3840,3841],{},"Linked List khác Array ở điểm nào?",[432,3843,3844,3847,3848,3851],{},[442,3845,3846],{},"🔵 Junior:","\n4. Vì sao Two Sum nên dùng HashMap?\n5. Pattern \"two pointer\" hay dùng khi nào? Cho 2 ví dụ.\n6. Binary Search cần điều kiện gì để chạy được?\n7. Tại sao ",[592,3849,3850],{},"mid = (l + r) \u002F 2"," có thể overflow? Fix sao?",[432,3853,3854,3857],{},[442,3855,3856],{},"🟡 Mid:","\n8. Kadane's algorithm là gì? Insight cốt lõi?\n9. Floyd's tortoise and hare hoạt động ra sao? Vì sao đúng?\n10. Time O(n log n) vs O(n + m) — khi nào nên prefer cái nào?",[432,3859,3860,3863],{},[442,3861,3862],{},"🔴 Senior:","\n11. Khi nào QuickSort tệ thành O(n²)? Fix bằng cách nào?\n12. HashMap có thể đạt O(n) worst case khi nào?\n13. Recursion vs Iteration — trade-off space\u002Freadability?",[432,3865,3866,3869,3870,489],{},[442,3867,3868],{},"Tham khảo thêm 38 bài DSA"," (ngắn hơn, kèm code): ",[3871,3872,3873],"a",{"href":94},"Ngân hàng câu hỏi DSA",[491,3875],{},[432,3877,3878,3879],{},"➡️ Ngày mai: ",[3871,3880,3881],{"href":63},"Ngày 7 — Mock interview",[3883,3884,3885],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":748,"searchDepth":761,"depth":761,"links":3887},[3888,3889,3896,3899,3910,3920,3930,3940,3949,3958,3959],{"id":429,"depth":761,"text":430},{"id":495,"depth":761,"text":496,"children":3890},[3891,3892,3893,3894,3895],{"id":500,"depth":767,"text":501},{"id":549,"depth":767,"text":550},{"id":679,"depth":767,"text":680},{"id":899,"depth":767,"text":900},{"id":991,"depth":767,"text":992},{"id":1192,"depth":761,"text":1193,"children":3897},[3898],{"id":1203,"depth":767,"text":1204},{"id":1220,"depth":761,"text":1221,"children":3900},[3901,3902,3903,3904,3905,3906,3907,3908,3909],{"id":1224,"depth":767,"text":1225},{"id":1271,"depth":767,"text":1272},{"id":1311,"depth":767,"text":1312},{"id":1394,"depth":767,"text":1395},{"id":1450,"depth":767,"text":1451},{"id":1529,"depth":767,"text":1530},{"id":1589,"depth":767,"text":1590},{"id":1607,"depth":767,"text":1608},{"id":1653,"depth":767,"text":1654},{"id":1763,"depth":761,"text":1764,"children":3911},[3912,3913,3914,3915,3916,3917,3918,3919],{"id":1767,"depth":767,"text":1768},{"id":1828,"depth":767,"text":1829},{"id":1884,"depth":767,"text":1885},{"id":1939,"depth":767,"text":1940},{"id":2095,"depth":767,"text":2096},{"id":2225,"depth":767,"text":2226},{"id":2245,"depth":767,"text":2246},{"id":2280,"depth":767,"text":2281},{"id":2341,"depth":761,"text":2342,"children":3921},[3922,3923,3924,3925,3926,3927,3928,3929],{"id":2345,"depth":767,"text":2346},{"id":2387,"depth":767,"text":2388},{"id":2405,"depth":767,"text":2406},{"id":2438,"depth":767,"text":2439},{"id":2453,"depth":767,"text":2454},{"id":2523,"depth":767,"text":2524},{"id":2540,"depth":767,"text":2541},{"id":2555,"depth":767,"text":2556},{"id":2647,"depth":761,"text":2648,"children":3931},[3932,3933,3934,3935,3936,3937,3938,3939],{"id":2651,"depth":767,"text":2652},{"id":2674,"depth":767,"text":2675},{"id":2742,"depth":767,"text":2743},{"id":2904,"depth":767,"text":2905},{"id":2974,"depth":767,"text":2975},{"id":3003,"depth":767,"text":3004},{"id":3020,"depth":767,"text":3021},{"id":3038,"depth":767,"text":3039},{"id":3100,"depth":761,"text":3101,"children":3941},[3942,3943,3944,3945,3946,3947,3948],{"id":3104,"depth":767,"text":3105},{"id":3127,"depth":767,"text":3128},{"id":3134,"depth":767,"text":3135},{"id":3178,"depth":767,"text":3179},{"id":3314,"depth":767,"text":3315},{"id":3384,"depth":767,"text":3385},{"id":3400,"depth":767,"text":3401},{"id":3440,"depth":761,"text":3441,"children":3950},[3951,3952,3953,3954,3955,3956,3957],{"id":3444,"depth":767,"text":3445},{"id":3470,"depth":767,"text":3471},{"id":3587,"depth":767,"text":3588},{"id":3627,"depth":767,"text":3628},{"id":3657,"depth":767,"text":3658},{"id":3669,"depth":767,"text":3670},{"id":3684,"depth":767,"text":3685},{"id":3707,"depth":761,"text":3708},{"id":3822,"depth":761,"text":3823},"Big O, array, string, linked list, stack, queue, hashmap. Học CÁCH SUY NGHĨ bài DSA — không chỉ code. Pattern chuẩn cho mọi bài.","md",null,{},{"title":57,"icon":60},{"title":422,"description":3960},"mMlyCzP4GWJeAdp5345X78IaArrLlYOVEhgM7ARKlBI",[3968,3970],{"title":52,"path":53,"stem":54,"description":3969,"icon":55,"children":-1},"Middleware pipeline trace, DI lifetimes + captive dependency, EF Core change tracking internals, loading strategies với N+1 demo, migrations.",{"title":62,"path":63,"stem":64,"description":3971,"icon":65,"children":-1},"STAR framework, giới thiệu bản thân PEEL, deal lương fresher .NET HCM, email follow-up. Mock 30 câu bấm giờ.",1783490354059]