leetcode 1128使用C++
时间: 2024-12-11 12:16:11 浏览: 9
leetcode刷题,C++刷题技巧
LeetCode 题目 1128 叫做 "构建最大数" (Build Maximum Number),这是一个关于字符串操作的动态规划问题。题目要求从给定的一系列无序整数数组中选择一些数,并按照非递减顺序连接成一个字符串。目标是找到可以构成的最大整数。
在 C++ 中,你可以通过以下步骤解决这个问题:
1. **创建结构体或类**:为了存储每个数字及其是否被选中,你可以创建一个结构体 `Choice` 包含整数值 `val` 和一个布尔值 `used` 表示是否被选中。
```cpp
struct Choice {
int val;
bool used;
};
```
2. **动态规划表**:初始化一个二维动态规划数组 `dp`,其中 dp[i][j] 存储前 i 个数字组成长度为 j 的最大整数。
3. **遍历数组**:对于数组中的每个数字,检查是否能将其添加到当前状态(即 dp[i][j]),并更新结果。有两种情况:如果它大于等于下一个数字,则将当前数字加到上一状态;否则,直接复制上一状态。
4. **回溯**:当结束所有数字的选择时,遍历 dp 数组,找出最大的那个元素作为结果。
5. **处理边界条件**:记得处理空数组的情况以及数组中只有一个数字的情况,此时最大整数就是原数组本身。
```cpp
class Solution {
public:
string largestNumber(vector<int>& nums) {
vector<Choice> choices(nums);
sort(choices.begin(), choices.end(), [](const Choice& a, const Choice& b) { return to_string(a.val) < to_string(b.val); });
// 初始化 dp
string res = "";
for (int n : nums)
res += to_string(n);
if (res[0] == '-') {
choices.erase(remove_if(choices.begin(), choices.end(), [n](const Choice& c) { return c.val == -1; }), choices.end());
reverse(res.begin(), res.end());
}
for (size_t i = 0; i < choices.size(); ++i) {
for (size_t len = 1; len <= res.length(); ++len) {
if (len > i) {
string str = to_string(choices[i].val);
bool valid = true;
for (size_t j = len - 1; j >= i && valid; --j) {
if (str[0] + res[j] < res[j]) {
valid = false;
break;
}
}
if (valid) {
res.insert(res.begin() + len, str[0]);
choices[i].used = true;
break;
}
}
}
}
return removeDuplicates(res);
}
private:
string removeDuplicates(string s) {
string result;
for (char ch : s) {
if (result.find(ch) == string::npos) {
result.push_back(ch);
}
}
return result;
}
};
```
阅读全文