iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0
Software Development

30天刷完leetcoode75系列 第 21 篇

C++ 演算法練習 Day21|215, 216 題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20261005/201842657KAjwE2ob2.png

題目解析:找出陣列中第 k 大的數字,且不需要將整個陣列完整排序
解題思路:設一個由小到大排的優先佇列 v 來裝目前前 k 大的數字。丟進迴圈把數字一個個拿出來,如果佇列還沒滿 k 個就直接塞。如果滿了,就拿當前數字跟佇列最上面(目前的第 k 大)比,如果比較大就把最上面的拔掉,換新的進去。迴圈跑完,最上面的數字就是答案

class Solution {
public:
    int findKthLargest(vector& nums, int k) {
        priority_queue, greater> v;

        for(int i=0; i v.top()){
                v.pop();
                v.push(nums[i]);
            }
        }

        return v.top();
    }
};

https://ithelp.ithome.com.tw/upload/images/20261005/20184265vSq6n8V4N7.png

題目解析:找出所有相加總和為 n 的 k 個數字組合,只能用 1 到 9 的數字,且每個數字最多用一次。
解題思路:設陣列 ans 裝所有組合,陣列 v 裝目前的數字。寫一個 dfs 遞迴函數,傳入起始數字、k 跟還要湊的總和。迴圈從起始數字跑到 9,如果數字超過剩餘總和就提早中斷。不然就把數字塞進 v,繼續遞迴找下一個數,找完把數字拔出來回溯。當收集滿 k 個數且剩餘總和剛好為 0,就把 v 塞進 ans,最後回傳 ans

class Solution {
public:
    vector> ans;
    vector v;

    void dfs(int start, int k, int remain) {
        if (v.size() == k) {
            if (remain == 0) ans.push_back(v);
            return;
        }
        for (int i = start; i <= 9; i++) {
            if (i > remain) break;
            v.push_back(i);
            dfs(i + 1, k, remain - i);
            v.pop_back();
        }
    }

    vector> combinationSum3(int k, int n) {
        dfs(1, k, n);
        return ans;
    }
};

上一篇
C++ 演算法練習 Day20|1926, 374 題解與思路分享
下一篇
C++ 演算法練習 Day22|162, 875 題解與思路分享
系列文
30天刷完leetcoode75 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言