注意点:
1. cmp函数在作为类成员函数的时候一定需要static修饰
这是因为所有我们在类内定义的非static成员函数在经过编译后隐式的为他们添加了一个this指针参数!变为了:
bool cmp(Solution *this, int a, int b)
而标准库的sort()函数的第三个cmp函数指针参数中并没有这样this指针参数,因此会出现输入的cmp参数和sort()要求的参数不匹配,从而导致了:
error: reference to non-static member function must be called
而我们知道static静态类成员函数是不需要this指针的,因此改为静态成员函数即可通过!
class Solution {
private:
// 一定要加上static
static bool cmp(int a, 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++) {
// 如果容器中的数小于0,而且k值还有的话,就将容器中的数进行反转
if(nums[i] < 0 && k > 0) {
nums[i] *= -1;
k--;
}
}
// 如果K值还有的话,总是反转最后一个数,即最小的那个数
if(k % 2 == 1) nums[nums.size()-1] *= -1;
int result = 0;
for(int i : nums) result += i;
return result;
}
};
注意点:
1.gas和cost的差值来解和这个问题
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];
// 如果遇到累加小于0的话,curSum清零,start+1
if(curSum < 0) {
start = i+1;
curSum = 0;
}
}
// 当所有的gas和cost的差值之和小于0的话,
if(totalSum < 0) return -1;
return start;
}
};
注意点:
1. 确定右孩子大于左孩子的情况是从左到右进行for循环
2.确定左孩子大于右孩子的情况是从右向左进行for循环
3.根据贪婪算法,对注意点中1和注意点中2for循环所得的结果取最大值即可,最后求和
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candyVec(ratings.size(), 1);
// 从后往前比较
for(int i = 1; i < ratings.size(); i++) {
if(ratings[i] > ratings[i-1]) candyVec[i] = candyVec[i-1] +1;
}
// 从前往后进行比较,最后与从前往后的进行比较,根据贪婪算法的原则,取最大的那个
for(int i = ratings.size()-2; i >= 0; i--) {
if(ratings[i] > ratings[i+1]) candyVec[i] = max(candyVec[i], candyVec[i+1]+1);
}
int result = 0;
for(int i : candyVec) result += i;
return result;
}
};