1. 贪心算法
遵循某种规则,不断贪心地选取当前最优策略的算法设计方法。
如果我们不慎重地选择一个正确的规则,就会得到错误的算法。
2. 题解
解法一:
开始我使用了两个 for 循环,外层 for 循环计算子序列的和,内层 for 循环计算剩下的数的和。
class Solution {
public:
vector<int> minSubsequence(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end(), greater<int>());
int sum1 = 0;
int sum2 = 0;
vector<int> ans;
int i = 0;
for (i = 0; i < n; i++)
{
sum1 += nums[i];
ans.push_back(nums[i]);
sum2 = 0;
for (int j = i + 1; j < n; j++)
{
sum2 += nums[j];
}
if (sum1 > sum2)
{
break;
}
}
return ans;
}
};
解法二:
后来为了降低时间复杂度,使用贪心算法,简化内层循环,代码如下:
class Solution {
public:
vector<int> minSubsequence(vector<int>& nums) {
sort(nums.begin(), nums.end(), greater<int>());
int sum = accumulate(nums.begin(), nums.end(), 0);
vector<int> ans;
int curr = 0;
for (int i = 0; i < nums.size(); i++)
{
curr += nums[i];
ans.push_back(nums[i]);
if (sum - curr < curr)
{
break;
}
}
return ans;
}
};
执行用时 8ms,之前是 20ms。