1005.K次取反后最大化的数组和
C++:
class Solution {
static bool cmp(int a,int b){
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
//if(nums.size()<k) return -1;
//升序
sort(nums.begin(),nums.end(),cmp);
int sum=0;
//将前面的负数反转
for(int i=0;i<nums.size();i++){
if(k>0&&nums[i]<0){
nums[i]=-nums[i];
k--;
}
}
//如果K还大于0,那么反复转变数值最小的元素,将K用完
while(k--) nums[nums.size()-1]*=-1;
for(int i=0;i<nums.size();i++) sum+=nums[i];
return sum;
}
};
C#:
public class Solution {
public int LargestSumAfterKNegations(int[] nums, int k) {
Array.Sort(nums,(p1, p2) => {
if (Math.Abs(p1) > Math.Abs(p2))
return -1;
else if (Math.Abs(p1) < Math.Abs(p2))
return 1;
else
return 0;
});
//Array.Reverse(nums);//jiang序
for (int i = 0; i < nums.Length; i++) { // 第二步
if (nums[i] < 0 && k > 0) {
nums[i] *= -1;
k--;
}
}
if (k % 2 == 1) nums[nums.Length - 1] *= -1; // 第三步
int res=0;
foreach(int a in nums) res+=a;
return res;
}
}
134. 加油站
C++:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
vector<int> gc;
int resIndex=0;int currSum=0;int totalSum=0;
if(gas.size()!=cost.size()) return -1;
for(int i=0;i<gas.size();i++)
gc.push_back(gas[i]-cost[i]);
for(int i=0;i<gas.size();i++){
currSum+=gc[i];
totalSum+=gc[i];
if(currSum<0){
resIndex=i+1;//起始位置更新为i+1
currSum=0;
}
}
if(totalSum<0) return -1;//说明怎么走都不可能跑一圈
return resIndex;
}
};
C#:
public class Solution {
public int CanCompleteCircuit(int[] gas, int[] cost) {
if(gas.Length!=cost.Length) return -1;
int resIndex=0;int totalSum=0;int curSum=0;
int []gc=new int[gas.Length];
for(int i=0;i<gas.Length;i++){
gc[i]=gas[i]-cost[i];
}
for(int i=0;i<gc.Length;i++){
curSum+=gc[i];
totalSum+=gc[i];
if(curSum<0){
resIndex=i+1;
curSum=0;
}
}
if(totalSum<0) return -1;
return resIndex;
}
}
135. 分发糖果
C++:
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candy(ratings.size(),1);
for(int i=1;i<ratings.size();i++){//you>zuo
if(ratings[i]>ratings[i-1]) candy[i]=candy[i-1]+1;
}
for(int i=ratings.size()-2;i>=0;i--){//zuo>you
if(ratings[i]>ratings[i+1]) candy[i]=max(candy[i],candy[i+1]+1);
}
int sum=0;
for(int c:candy) sum+=c;
return sum;
}
};
C#
public class Solution {
public int Candy(int[] ratings) {
int res=0;
int [] re=new int[ratings.Length]/*{1}*/;
for(int i=0;i<ratings.Length;i++){
re[i]=1;
}
for(int i=1;i<ratings.Length;i++){//zuo<you
if(ratings[i-1]<ratings[i])
re[i]=re[i-1]+1;
}
for(int i=ratings.Length-2;i>=0;i--){//zuo>you
if(ratings[i]>ratings[i+1])
re[i]=Math.Max(re[i+1]+1,re[i]);
}
for(int i=0;i<re.Length;i++)
res+=re[i];
return res;
}
}