C++ 程式檢查列表是否可以拆分為包含 k 個遞增元素的子列表
假設我們有一個名為 nums 的數字列表,以及另一個數字 k,我們需要檢查該列表是否可以拆分為多個列表,其中每個列表包含 k 個值,並且這些值是連續遞增的。
因此,如果輸入類似於 nums = [4, 3, 2, 4, 5, 6],k = 3,則輸出將為 True,因為我們可以將列表拆分為 [2, 3, 4] 和 [4, 5, 6]
為了解決這個問題,我們將遵循以下步驟:
定義一個對映
對於對映中的每個鍵 it
將 m[it] 增加 1
ok := true
當 (對映的大小不為 0 且 ok 為 true) 時,執行以下操作:
ok := false
對於對映中的每個鍵值對 it
如果 (it.key - 1) 不在對映中,則:
flag := true
從 i := it.key 開始,當 i <= it.key + k - 1 時,更新 (i 增加 1),執行以下操作:
如果 i 不存在於對映中,則:
flag := false
如果 flag 為 true,則:
從 i := it.key 開始,當 i <= it.key + k - 1 時,更新 (i 增加 1),執行以下操作:
(將 m[i] 減 1)
如果 m[i] 等於 0,則:
從對映中刪除 i
ok := true
退出迴圈
當對映為空時返回 true,否則返回 false。
讓我們看一下下面的實現來更好地理解:
示例
#include<bits/stdc++.h> using namespace std; class Solution { public: bool solve(vector<int> nums, int k) { map <int, int> m; for(auto& it : nums){ m[it]++; } bool ok = true; while(m.size() && ok){ ok = false; for(auto& it : m){ if(!m.count(it.first - 1)){ bool flag = true; for(int i = it.first; i <= it.first + k - 1;i++){ if(!m.count(i)) flag = false; } if(flag){ for(int i = it.first; i <= it.first + k - 1;i++){ m[i]--; if(m[i] == 0) m.erase(i); } ok = true; break; } } } } return m.empty(); } }; main(){ vector<int> v = {4, 3, 2, 4, 5, 6}; Solution ob; cout << ob.solve(v, 3); }
輸入
{4, 3, 2, 4, 5, 6}
輸出
1
廣告