1005.K次取反后最大化的数组和
题目链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/submissions/
代码:
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int result = 0;
for(int i = 0;i < nums.size(); i++)
{
if(nums[i] == 0)
k = 0;
if(i == 0 && nums[i] > 0)
{
nums[i] = nums[i] * pow(-1,k);
k = 0;
}
if(nums[i] > 0 && i > 0)
{
if(nums[i] > nums[i-1])
{
result -= nums[i-1];
nums[i-1] = nums[i-1] * pow(-1,k);
result += nums[i-1];
}else
nums[i] = nums[i] * pow(-1,k);
k = 0;
}
if(nums[i] < 0 && k > 0)
{
nums[i] = -nums[i];
k--;
}
if(i == nums.size() - 1 && k > 0)
{
nums[i] = nums[i] * pow(-1,k);
k = 0;
}
result += nums[i];
}
return result;
}
};
暴力解法 把出现的几种情况依次罗列出来
代码二:
class Solution {
public:
static bool cmp(int a,int b)
{
return abs(a) > abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),cmp);
int result = 0;
for(int i = 0;i < nums.size(); i++)
{
if(nums[i] < 0 && k > 0)
{
nums[i] = -nums[i];
k--;
}
result += nums[i];
}
if(k > 0)
{
result -= nums[nums.size() - 1];
nums[nums.size() - 1] = nums[nums.size() - 1] * pow(-1,k);
result += nums[nums.size() - 1];
}
return result;
}
};
cmp函数:>: 降序排列; < : 升序排列
134. 加油站
题目链接:https://leetcode.cn/problems/gas-station/
代码一(暴力解法):
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
for(int i = 0; i < cost.size(); i++)
{
int rest = gas[i] - cost[i];
int index = (i+1)%cost.size();
while(rest > 0 && index != i)
{
rest += gas[index] - cost[index];
index = (index + 1)%cost.size();
}
// if(rest >= 0 && index == i)
if(rest >= 0 && index == i)
{
return i;
}
}
return -1;
}
};
暴力 超时
代码二(贪心算法):
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int totalSum = 0;
int curSum = 0;
int start = 0;
for(int i = 0 ; i < cost.size(); i++)
{
totalSum += gas[i] - cost[i];
curSum += gas[i] - cost[i];
if(curSum < 0)
{
start = i+1;
curSum = 0;
}
}
if(totalSum < 0)
return -1;
return start;
}
};
135. 分发糖果
题目链接:https://leetcode.cn/problems/candy/submissions/
代码:
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> sep(ratings.size(),1);
if(ratings.size() == 1)
return 1;
for(int i = 1; i < ratings.size();i++)
{
if(ratings[i] > ratings[i-1])
{
sep[i] = sep[i-1] + 1;
}
}
for(int i = ratings.size() - 2; i >= 0; i--)
{
if(ratings[i] > ratings[i+1])
{
sep[i] = max(sep[i],sep[i+1]+1);
}
}
int result = 0;
for(int i = 0;i < sep.size();i++)
result += sep[i];
return result;
}
};
这道题可以