1005.K次取反后最大化的数组和
//sort() 函数的时间复杂度通常为 O(n log n)
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int min_nums = INT_MAX;
int index = 0;
while(k--)
{
for(int i=0;i<nums.size();i++)
{
if(min_nums>nums[i])
{
min_nums = nums[i];
index = i;
}
}
//更新数组中的元素
nums[index] = -nums[index];
min_nums = INT_MAX;
}
int sum = 0;
for(int i=0;i<nums.size();i++)
{
sum += nums[i];
}
return sum;
}
};
//第一个数据也有可能是最小值,time:11ms
class Solution {
static bool cmp(const int&a,const int&b)
{
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),cmp);
for(int i=0;i<nums.size();i++)
{
if(nums[i]<0&&k>0)
{
nums[i] = -nums[i];
k--;
}
}
if(k%2==1) nums[nums.size()-1] *= -1;
int sum = 0;
for(int a:nums)
{
sum += a;
}
return sum;
}
};
//快排操作,time:7ms
俩种题解,但是如果k的数值过于大,那么第二种,sort解法,还是最优题解
134. 加油站
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int cursum = 0;
int totalsum = 0;
int start = 0;
for(int i=0;i<gas.size();i++)
{
cursum += gas[i] - cost[i];
totalsum += gas[i] - cost[i];
if(cursum<0)
{
start = i+1;
cursum = 0;
}
}
if(totalsum<0) return -1;
else return start;
}
};
计算出到每一个加油站的剩余油量是正,还是负,关键还是计算全程的油量总和是正,还是负数
135. 分发糖果
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candy(ratings.size(),1);
for(int i=1;i<ratings.size();i++)
{
if(ratings[i]>ratings[i-1])
{
candy[i] = candy[i-1]+1;
}
}
for(int i=ratings.size()-2;i>=0;i--)
{
if(ratings[i]>ratings[i+1])
{
candy[i] = max(candy[i],candy[i+1]+1);
}
}
int result = 0;
for(int a:candy) result += a;
return result;
}
};
在进行从右到左的遍历之前,我们已经进行了从左到右的遍历,简单的来说,我们在草稿纸上进行模拟的过程也是以从左到右的遍历结果为主,所以在进行从右到左遍历的过程中,要取最大值,既可以满足左遍历,又可以满足右遍历