Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++
C++
  1. Triangle ใน C++: หา Minimum Path Sum จากบนลงล่าง

    โจทย์ Triangle array หา minimum path sum จากบนลงล่าง แต่ละขั้นเดินได้เฉพาะ adjacent ในแถวถัดไป ตัวอย่าง: [[2],[3,4],[6,5,7],[4,1,8,3]] → 11 (2+3+5+1) แนวคิด: Bottom-up DP (In-place) เริ่มจากแถวสุดท้าย-1 ขึ้นบน: dp[j] = triangle[i][j] + min(dp[j], dp[j+1]) ขั้นตอน dp = triangle.back() (copy แถวส

  2. Insertion Sort List ใน C++: เรียง Linked List ด้วย Insertion Sort

    โจทย์ เรียง Linked List แบบ Insertion Sort ตัวอย่าง: [9,45,23,71,80,55] → [9,23,45,55,71,80] แนวคิด: Dummy Head + Insert Sorted สร้าง dummy head สร้าง sorted list ใหม่ ดึงโหนดจาก list เดิมทีละตัว insert เข้า sorted list ที่ตำแหน่งที่ถูกต้อง ขั้นตอน dummy = new ListNode(-1), node = head while

  3. Populating Next Right Pointers in Each Node II ใน C++: เชื่อม Next Pointer ต้นไม้ไบนารีทั่วไป

    โจทย์ ต้นไม้ไบนารีทั่วไป (ไม่จำเป็นต้อง complete) แต่ละโหนดมี left, right, next ตั้งค่า next ชี้ไปโหนดขวาในระดับเดียวกัน (NULL ถ้าไม่มี) แนวคิด: Level Order Traversal ไม่ใช้ Queue (O(1) Space) ใช้ pointer pre เดินระดับปัจจุบัน nextPre จดโหนดแรกของระดับถัดไป prev จดโหนดล่าสุดในระดับถัดไป ขั้นตอน

  4. Find K Pairs with Smallest Sums ใน C++: หาคู่ที่มีผลรวมน้อยที่สุด k คู่

    โจทย์ อาร์เรย์เรียงลำดับ A1, A2 หา k คู่ (u,v) u∈A1, v∈A2 ที่มีผลรวมน้อยที่สุด เรียงตามผลรวม ตัวอย่าง: A1=[1,7,11], A2=[2,4,6], k=3 → [(1,2),(1,4),(1,6)] แนวคิด: Min-Heap (Priority Queue) เริ่มจากคู่ (A1[i], A2[0]) ทุก i ใส่ heap เรียงตาม sum ดึงคู่น้อยสุด แล้ว push (A1[i], A2[idx+1]) ต่อ ขั้นตอน

  5. Guess Number Higher or Lower II ใน C++: หาต้นทุนต่ำสุดเพื่อเดาตัวเลข

    โจทย์ เกมเดาตัวเลข 1..n เดาผิดจ่ายเงินเท่าตัวเลขที่เดา รู้ว่าเป้าหมายสูง/ต่ำ หาต้นทุนต่ำสุดที่รับประกันชนะ (worst case) ตัวอย่าง: n=10, เป้าหมาย=8 เดา 5→จ่าย5, เดา7→จ่าย7, เดา9→จ่าย9 รวม 21 แต่ optimal strategy ให้ต้นทุนต่ำกว่า แนวคิด: DP Minimax (Interval DP) cost(lo, hi) = ต้นทุนต่ำสุดสำหรับช่วง

  6. Reorganize String ใน C++: จัดเรียงสตริงไม่ให้ตัวอักษรติดกันซ้ำ

    โจทย์ กำหนดสตริง S จัดเรียงใหม่ไม่ให้ตัวอักษรติดกันเหมือนกัน ถ้าไม่ได้คืน empty string ตัวอย่าง: AAB → ABA แนวคิด: Greedy + Max Heap (Priority Queue) นับความถี่ตัวอักษร ใส่ max-heap เรียงตามความถี่มาก→น้อย แต่ละรอบดึง 2 ตัวบนสุด (ที่เหลือมากที่สุด) ใส่สลับกัน ลดความถี่ push กลับ ขั้นตอน นับความ

  7. Number of Matching Subsequences ใน C++: นับคำใน Dictionary ที่เป็น Subsequence

    โจทย์ กำหนดสตริง S และ dictionary words[] นับว่ามีกี่คำที่เป็น subsequence ของ S ตัวอย่าง: S=abcde, words=[a,bb,acd,ace] → 3 (a,acd,ace) แนวคิด: Bucket by Next Character + BFS Style จัดกลุ่มคำตามตัวอักษรถัดไปที่ต้องจับคู่ อ่าน S ซ้าย→ขวา ย้ายคำไปกลุ่มถัดไปเมื่อจับคู่ได้ ขั้นตอน สร้าง map<cha

  8. Most Profit Assigning Work ใน C++: กำหนดงานให้คนทำงานเพื่อกำไรสูงสุด

    โจทย์ มีงาน n งาน: difficulty[i], profit[i] มีคนงาน m คน: worker[i] = ความสามารถ (ทำงานได้ที่ difficulty ≤ worker[i]) คนงานแต่ละคนทำได้ ≤ 1 งาน งานทำซ้ำได้ หากำไรรวมสูงสุด ตัวอย่าง: diff=[2,4,6,8,10], profit=[10,20,30,40,50], worker=[4,5,6,7] → 100 (มอบงาน diff 4,4,6,6 → profit 20+20+30+30) แนวคิด:

  9. Online Stock Span ใน C++: คำนวณ Stock Span แบบ Real-time

    โจทย์ ออกแบบ class StockSpanner รองรับ next(price) คืน span = จำนวนวันติดต่อกันย้อนหลัง (รวมวันนี้) ที่ราคา ≤ ราคาวันนี้ ตัวอย่าง: [100,80,60,70,60,75,85] → [1,1,1,2,1,4,6] แนวคิด: Monotonic Stack (Decreasing) เก็บคู่ (price, span) ใน stack เรียงราคาลดลง วันใหม่: pop ทั้งหมดที่ ≤ price รวม span เข้

  10. Fruit Into Baskets ใน C++: หา Subarray ยาวสุดที่มีค่าต่างกัน ≤ 2 ชนิด

    โจทย์ อาร์เรย์ tree[i] = ชนิดผลไม้ มีตะกร้า 2 ใบ แต่ละใบเก็บได้ 1 ชนิด เริ่มต้นที่ไหนก็ได้ เดินขวาเรื่อยๆ หาจำนวนผลไม้สูงสุดที่เก็บได้ ตัวอย่าง: [3,3,3,1,2,1,1,2,3,3,4] → 5 (subarray [1,2,1,1,2]) แนวคิด: Sliding Window + Hash Map นับความถี่ รักษา window [j, i] ที่มีชนิดผลไม้ ≤ 2 ชนิด ขยาย i เพิ่มชน

  11. Minimum Falling Path Sum ใน C++: หาเส้นทางผลรวมน้อยที่สุดในเมทริกซ์

    โจทย์ เมทริกซ์ n×n หา falling path sum น้อยที่สุด: เริ่มแถวแรกคอลัมน์ไหนก็ได้ เลือก 1 ตัวต่อแถว คอลัมน์ถัดไปต่างได้ ≤ 1 ตัวอย่าง: [[1,2,3],[4,5,6],[7,8,9]] → 12 (เส้นทาง 1→4→7) แนวคิด: Bottom-up DP แก้ไขในเมทริกซ์เดิม จากแถวล่างสุดขึ้นบน: dp[i][j] = matrix[i][j] + min(dp[i+1][j-1], dp[i+1][j], dp[i

  12. Subarray Sums Divisible by K ใน C++: นับ Subarray ผลรวมหาร K ลงตัว

    โจทย์ อาร์เรย์ A หาจำนวน subarray ต่อเนื่องไม่ว่าง ที่ผลรวมหาร k ลงตัว ตัวอย่าง: A=[4,5,0,-2,-3,1], k=5 → 7 subarrays แนวคิด: Prefix Sum + Modulo Counting ถ้า prefix[j] % k == prefix[i] % k (i < j) → subarray (i+1..j) หาร k ลงตัว นับความถี่ของแต่ละ modulo value ขั้นตอน map m; m[0] = 1 (prefix s

  13. Max Consecutive Ones III ใน C++: หา Subarray 1s ยาวสุดหลังพลิก 0 ได้ k ตัว

    โจทย์ อาร์เรย์ 0/1 สามารถพลิก 0 → 1 ได้สูงสุด k ตัว หา subarray ต่อเนื่องที่เป็น 1 ทั้งหมดยาวสุด ตัวอย่าง: A=[1,1,1,0,0,0,1,1,1,1,0], k=2 → 6 (พลิก 2 ตัวกลางได้ 6 ตัวติดกัน) แนวคิด: Sliding Window รักษา window [j, i] ที่มี 0 ≤ k ตัว ขยาย i เพิ่ม 0 ให้ k-- ถ้า k < 0 → กด j ไปข้างหน้าจน k ≥ 0 ขั้นตอ

  14. Arithmetic Slices ใน C++: นับ Subarray ที่เป็นเลขคณิต

    โจทย์ Arithmetic Sequence = ลำดับ ≥ 3 ตัว ที่ความต่างระหว่างติดกันคงที่ หาจำนวน subarray (ต่อเนื่อง) ที่เป็น arithmetic slice ตัวอย่าง: [1,2,3,4] → 3 slices: [1,2,3], [2,3,4], [1,2,3,4] แนวคิด: DP นับ slice ที่ลงท้ายที่ i ถ้า A[i] - A[i-1] == A[i-1] - A[i-2] แล้ว slice ที่ลงท้าย i-1 มี dp[i-1] ตัว

  15. Stone Game II ใน C++: เกมกองหิน Alice vs Bob เล่นเหมาะสมที่สุด

    โจทย์ อาร์เรย์ piles แทนกองหิน Alice เริ่มก่อน M=1 แต่ละรอบผู้เล่นหยิบ X กองแรก (1 ≤ X ≤ 2M) ตั้ง M = max(M, X) ใครได้หินมากที่สุดชนะ หาจำนวนหินสูงสุดที่ Alice ได้ ตัวอย่าง: [2,7,9,4,4] → 10 (Alice หยิบ 1, Bob หยิบ 2, Alice หยิบ 2 → 2+4+4=10) แนวคิด: DP + Minimax (Suffix Sum) ให้ arr[i] = suffix su

  16. Remove All Adjacent Duplicates in String II ใน C++: ลบตัวอักษรติดกัน k ตัว

    โจทย์ กำหนดสตริง s และจำนวน k ลบกลุ่มตัวอักษรเดียวกันที่ติดกัน k ตัวซ้ำๆ จนไม่สามารถลบได้แล้ว คืนสตริงสุดท้าย ตัวอย่าง: s=deeedbbcccbdaa, k=3 → ลบ eee,ccc → ddbbbdaa → ลบ bbb → dddaa → ลบ ddd → aa แนวคิด: Stack เก็บ (ตัวอักษร, จำนวนติดต่อกัน) อ่านซ้ายไปขวา เก็บคู่ (char, count) ใน stack ถ้า count =

  17. Stepping Numbers ใน C++: หาตัวเลขที่ตัวเลขติดกันต่างกัน 1

    โจทย์ Stepping Number คือจำนวนเต็มที่ตัวเลขติดกันทุกคู่มีความต่างสัมบูรณ์ = 1 (เช่น 321 ✓, 421 ✗) หา Stepping Numbers ทั้งหมดในช่วง [low, high] เรียงลำดับ ตัวอย่าง: low=0, high=21 → [0,1,2,3,4,5,6,7,8,9,10,12,21] แนวคิด: DFS สร้างตัวเลขแบบเพิ่มหลักท้ายทีละตัว เริ่มจาก 0-9 สร้างต่อโดยเพิ่มหลักท้าย ±

  18. Path with Maximum Gold ใน C++: หาทองคำสูงสุดในกริดด้วย DFS

    โจทย์ กริด m×n แต่ละเซลล์มีทองคำ (0 = ว่าง) เริ่มที่เซลล์ไหนก็ได้ เดิน 4 ทิศทาง ไม่ซ้ำเซลล์ ไม่เดินเซลล์ 0 หาทองคำสูงสุดที่เก็บได้ ตัวอย่าง: [[0,6,0],[5,8,7],[0,9,0]] → 24 (เส้นทาง 9→8→7) แนวคิด: DFS + Backtracking ลองเริ่มจากทุกเซลล์ที่ไม่ใช่ 0 DFS สำรวจ 4 ทิศทาง ทำเครื่องหมาย visited ด้วยการตั้งค

  19. Dice Roll Simulation ใน C++: นับลำดับการทอยลูกเต๋าที่ไม่ซ้ำภายใต้เงื่อนไข

    โจทย์ ลูกเต๋า 6 หน้า ทอย n ครั้ง หน้า i ไม่อนุญาตให้ออกติดกันเกิน rollMax[i] ครั้ง (1-indexed) หาจำนวนลำดับที่เป็นไปได้ ตัวอย่าง: n=2, rollMax=[1,1,2,2,2,3] → 34 (จาก 36 ลบ (1,1) และ (2,2) ที่ห้ามติดกัน) แนวคิด: DP + Memoization (Top-down) State: dfs(dieLeft, lastFace, currLen) = จำนวนวิธีทอยอีก di

Total 6007 -คอมพิวเตอร์  FirstPage PreviousPage NextPage LastPage CurrentPage:165/301  20-คอมพิวเตอร์/Page Goto:1 159 160 161 162 163 164 165 166 167 168 169 170 171