Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++
C++
  1. Insert Interval ใน C++

    สมมติว่าเรามีชุดของช่วงที่ไม่ทับซ้อนกัน เราต้องแทรกช่วงใหม่เข้าไปในช่วงเหล่านั้น สามารถรวมช่วงได้หากจำเป็น เช่นถ้าอินพุตคือ [[1,4],[6,9]] และช่วงใหม่คือ [2,5] ผลลัพธ์จะเป็น [[1,5],[6,9]]ขั้นตอนการแก้ปัญหาแทรกช่วงใหม่ลงท้ายรายการช่วงเดิมเรียงลำดับรายการช่วงตามเวลาเริ่มต้นของช่วง n := จำนวนช่วงสร้างอา

  2. Text Justification ใน C++

    สมมติว่าเรามีอาร์เรย์ของคำและความกว้าง maxWidth เราต้องจัดรูปแบบข้อความให้แต่ละบรรทัดมีตัวอักษรพอดี maxWidth ตัวและจัดเต็มทั้งสองข้าง (fully justified) เราควรจัดคำแบบ greedy คือ ใส่คำให้มากที่สุดในแต่ละบรรทัด เราจะเติมช่องว่างเพิ่มเติมเมื่อจำเป็น เพื่อให้แต่ละบรรทัดมีตัวอักษรพอดี maxWidth ตัวช่องว่า

  3. Edit Distance ใน C++

    สมมติว่าเรามีคำสองคำคือ word1 และ word2 เราต้องหาจำนวนการดำเนินการขั้นต่ำที่ต้องใช้เพื่อแปลง word1 เป็น word2 การดำเนินการมี 3 ประเภท ได้แก่ เพิ่มตัวอักษร ลบตัวอักษร และแทนที่ตัวอักษร เช่นถ้าสตริงอินพุตคือ evaluate และ fluctuate ผลลัพธ์จะเป็น 5ขั้นตอนการแก้ปัญหาn := ขนาดของ w1, m := ขนาดของ w2สร้างอ

  4. Minimum Window Substring ใน C++

    สมมติว่าเรามีสตริง S และ T เราต้องหา window ขนาดเล็กที่สุดใน S ที่มีตัวอักษรทั้งหมดใน T เช่นถ้าอินพุตคือ ABHDAXCVBAGTXATYCB และ T = ABC ผลลัพธ์จะเป็น CVBAขั้นตอนการแก้ปัญหาสร้างแมป mเก็บความถี่ของ x ลงใน mlength := ขนาดของ s, left := 0, right := 0, ansLeft := 0 และ ansRight := 0counter := ขนาดของ x,

  5. Maximal Rectangle ใน C++

    สมมติว่าเรามีเมทริกซ์ 2D แบบไบนารีที่มีค่า 0 และ 1 เราต้องหาสี่เหลี่ยมผืนผ้าที่ใหญ่ที่สุดที่ประกอบด้วยแต่ 1 และคืนค่าพื้นที่ขั้นตอนการแก้ปัญหากำหนดฟังก์ชัน getAns รับอาร์เรย์ aสร้างสแต็ก st, i := 0, ans := 0while i < ขนาดของ aถ้าสแต็กว่างหรือ a[i] >= ตัวบนสุดของสแต็ก ใส่ i ลง st, เพิ่ม i ขึ้น

  6. Interleaving String ใน C++

    สมมติว่าเรามีสตริงสามตัวคือ s1, s2 และ s3 ตรวจสอบว่า s3 ถูกสร้างจากการ interleaving ของ s1 และ s2 หรือไม่ เช่นถ้าสตริงคือ aabcc, s2 = dbbca, และ s3 คือ aadbbcbcac ผลลัพธ์จะเป็น trueขั้นตอนการแก้ปัญหากำหนดเมธอด solve() รับ s1, s2, s3 และอาร์เรย์ 3 มิติ dp พร้อม i, j, kถ้า i = 0 และ j = 0 และ k = 0 คื

  7. กู้คืน Binary Search Tree ใน C++

    สมมติว่าเรามี Binary Search Tree (BST) หนึ่งต้น พิจารณาว่ามีองค์ประกอบสองตัวของ BST นี้ถูกสลับที่กัน เราต้องกู้คืน BST ให้กลับสู่สภาพเดิมเช่น ต้นไม้ที่กำหนดเป็นแบบแรก (ต้นแรก) ต้นไม้ที่กู้คืนแล้วจะเป็นแบบที่สองขั้นตอนการแก้ปัญหากำหนดตัวอ้างอิง prev, first, second สำหรับโหนดกำหนดเมธอด findProblem() ท

  8. Subsequences ที่แตกต่างกันใน C++

    สมมติว่าเรามีสตริง S และ T เราต้องนับจำนวน subsequences ที่แตกต่างกันของ S ที่เท่ากับ Tเรารู้ว่า subsequence ของสตริงคือสตริงใหม่ที่สร้างจากสตริงต้นฉบับโดยการลบตัวอักษรบางส่วน (อาจไม่ลบเลย) โดยไม่เปลี่ยนตำแหน่งสัมพัทธ์ของตัวอักษรที่เหลือ (เช่น ACE เป็น subsequence ของ ABCDE แต่ AEC ไม่ใช่)ถ้าสตริงอิ

  9. การแบ่งพาลินโดรมน้อยที่สุดใน C++ (Palindrome Partitioning II)

    ภาพรวมปัญหา หาจำนวนการตัดน้อยที่สุดของสตริง ให้ทุกชิ้นเป็นพาลินโดรม ตัวอย่าง ababba → 2 ครั้ง (aba|bb|a) วิธีแก้ปัญหา: DP + Palindrome Check res[i] = ตัดน้อยที่สุดจาก index i ถึงท้าย res[n] = -1 (base) res[i] = min(1 + res[j+1]) สำหรับทุก j ที่ s[i..j] เป็นพาลินโดรม โค้ด C++ #include <bits/std

  10. แจกลูกอมใน C++ (Candy)

    ภาพรวมปัญหา เด็ก N คนเรียงกัน แต่ละคนมี rating ให้ลูกอมตามกติกา: 1. ทุกคนได้อย่างน้อย 1 ลูก 2. Rating สูงกว่าเพื่อนบ้าง → ได้ลูกอมมากกว่าเพื่อนบ้าน ตัวอย่าง [1,1,3] → ลูกอม: [1,1,2] → รวม 4 วิธีแก้ปัญหา: Two Pass Greedy rating[i-1] → dp[i] = dp[i-1] + 1 rating[i+1] → dp[i] = max(dp[i], dp[i+1]

  11. จุดสูงสุดบนเส้นตรงเดียวกันใน C++ (Max Points on a Line)

    ภาพรวมปัญหา ให้จุดบนระนาบ 2D หาจุดมากที่สุดที่อยู่บนเส้นตรงเดียวกัน ตัวอย่าง Points: (1,1), (3,2), (5,3), (4,1), (2,3), (1,4) → 4 จุด วิธีแก้ปัญหา: O(N³) Brute Force (ตรวจสอบทุกคู่) สำหรับแต่ละคู่จุด (i-1, i) หาจุดอื่นที่อยู่เส้นเดียวกัน ใช้ cross product: (y3-y2)(x2-x1) == (y2-y1)(x3-x2) โค้ด C+

  12. หาค่าน้อยสุดในอาเรย์หมุนแบบมีซ้ำใน C++ (Find Minimum in Rotated Sorted Array II)

    ภาพรวมปัญหา อาเรย์เรียงแล้วหมุน (rotated) อาจมีค่าซ้ำ หาค่าน้อยสุด ตัวอย่าง [4,5,5,5,6,8,2,3,4] → 2 วิธีแก้ปัญหา: Binary Search แบบจัดการค่าซ้ำ แบ่งกรณีจาก mid: - arr[low] < arr[mid]: ด้านซ้ายเรียง → min อยู่ขวา หรือ arr[low] arr[mid]: ด้านขวาเรียง → min อยู่ซ้าย หรือ arr[mid] - arr[low] == arr[mi

  13. ช่องว่างสูงสุดใน C++ (Maximum Gap)

    ภาพรวมปัญหา ให้อาเรย์ไม่เรียง หาความต่างสูงสุดระหว่างสมาชิกติดกันในอาเรย์ที่เรียงแล้ว ตัวอย่าง [12,3,9,1,17] → เรียง: [1,3,9,12,17] → max gap = 9-3 = 6 วิธีแก้ปัญหา: Bucket Sort (Pigeonhole Principle) ไม่ต้องเรียงทั้งอาเรย์ ใช้ bucket n-1 ใบ - หา minVal, maxVal - gap = ceil((maxVal-minVal)/(n-1))

  14. เกมดันเจี้ยนใน C++ (Dungeon Game)

    ภาพรวมปัญหา 0 ตลอด) ตัวอย่าง Grid: -2 -2 3 -5 -10 1 10 30 -5 Output: 6 (Path: Right→Right→Down→Down) วิธีแก้ปัญหา: DP จากท้ายมาหน้า (Bottom-Up) dp[i][j] = พลังชีวิตขั้นต่ำที่ต้องมี ก่อนเข้า ช่อง (i,j) เพื่อให้รอด Base: dp[m-1][n-1] = max(1, 1 - grid[m-1][n-1]) Transition: dp[i][j] = max(1, min(d

  15. ซื้อขายหุ้นสูงสุด K ครั้งใน C++ (Best Time to Buy and Sell Stock IV)

    ภาพรวมปัญหา ให้ราคาหุ้นรายวัน หากำไรสูงสุดจากการซื้อขายได้สูงสุด k ครั้ง (ต้องขายก่อนซื้อครั้งใหม่) ตัวอย่าง prices = [3,2,6,4,0,3], k = 2 → 7 ซื้อวันที่ 2 (2) ขายวันที่ 3 (6) กำไร 4 ซื้อวันที่ 5 (0) ขายวันที่ 6 (3) กำไร 3 วิธีแก้ปัญหา: DP 3 มิติ + Optimization dp[i][k][holding] = กำไรสูงสุดวันที่

  16. พาลินโดรมสั้นที่สุดใน C++ (Shortest Palindrome)

    ภาพรวมปัญหา เพิ่มตัวอักษรด้านหน้าสตริง ให้กลายเป็นพาลินโดรมที่สั้นที่สุด ตัวอย่าง abcc → ccbabcc วิธีแก้ปัญหา: KMP (LPS Array) สร้าง s2 = reverse(s) สร้าง pattern = s + # + s2 คำนวณ LPS (Longest Prefix Suffix) array ของ pattern LPS สุดท้าย = ความยาว prefix ของ s ที่เป็น suffix ของ s2 = พาลินโดรมย

  17. เครื่องคิดเลขพื้นฐานใน C++ (Basic Calculator)

    ภาพรวมปัญหา คำนวณนิพจน์ที่มี +, -, 括號, และ space ตัวอย่าง 5 + 2 - 3 → 4 วิธีแก้ปัญหา: Stack + Single Pass เก็บ ret (ผลรวมปัจจุบัน), sign (+1/-1), num (ตัวเลขกำลังอ่าน) เจอ (: push ret, push sign, reset ret=0, sign=1, num=0 เจอ ): ret += sign×num, pop sign×ret, pop +ret เจอ +/-: ret += sign×num, u

  18. นับเลข 1 ในช่วง 1 ถึง N ใน C++ (Number of Digit One)

    ภาพรวมปัญหา นับจำนวนหลัก 1 ที่ปรากฏในตัวเลข 1 ถึง n ตัวอย่าง n = 15 → เลขที่มี 1: 1,10,11,12,13,14,15 → รวม 8 ตัว วิธีแก้ปัญหา: คณิตศาสตร์ต่อหลัก (Digit DP แบบ iterative) พิจารณาแต่ละหลัก (หน่วย, สิบ, ร้อย, ...) สำหรับหลักที่มีค่า i (1, 10, 100, ...): - a = n / i, b = n % i, x = a % 10 - x == 0: เ

  19. ค่าสูงสุดแบบหน้าต่างเลื่อนใน C++ (Sliding Window Maximum)

    ภาพรวมปัญหา ให้อาเรย์ nums และขนาดหน้าต่าง k หาค่าสูงสุดในแต่ละหน้าต่างที่เลื่อนทีละ 1 ตัวอย่าง nums = [1,3,-1,-3,5,3,6,8], k = 3 Output: [3,3,5,5,6,8] วิธีแก้ปัญหา: Deque (Monotonic Queue) เก็บ index ใน deque เรียงตามค่า nums จากมากไปน้อย - Front = ค่าสูงสุดของหน้าต่างปัจจุบัน - Pop back: ขณะ num

  20. เพิ่มตัวดำเนินการในสตริงเพื่อให้ได้ค่าเป้าหมายใน C++ (Expression Add Operators)

    ภาพรวมปัญหา ให้สตริงตัวเลข และค่าเป้าหมาย target ใส่ +, -, * ระหว่างตัวเลข เพื่อให้สมการได้ค่า target คืนคำตอบทั้งหมด ตัวอย่าง num = 232, target = 8 → [2*3+2, 2+3*2] วิธีแก้ปัญหา: Backtracking (DFS) ลองตัดสตริงเป็น operand ตัวต่างๆ แล้วลองวาง operator 3 แบบ ใช้ curr = ค่าปัจจุบัน, mult = ตัวคูณล่า

Total 6007 -คอมพิวเตอร์  FirstPage PreviousPage NextPage LastPage CurrentPage:176/301  20-คอมพิวเตอร์/Page Goto:1 170 171 172 173 174 175 176 177 178 179 180 181 182