1005. K 次取反后最大化的数组和
思路: 按照绝对值排序,感觉之前某道题也是。
- 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
- 第二步:从前向后遍历,遇到负数将其变为正数,同时K–
- 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
- 第四步:求和
public class Solution {
public int CompareStrings(int a, int b)
{
return Math.Abs(a) > Math.Abs(b) ? -1 : 1;
}
public int LargestSumAfterKNegations(int[] nums, int k) {
Array.Sort(nums, CompareStrings);
for (int i = 0; i < nums.Length; i++)
{
if (nums[i] < 0 && k > 0)
{
nums[i] = -nums[i];
k--;
}
}
if (k % 2 != 0) nums[nums.Length - 1] = -nums[nums.Length - 1];
int sum = 0;
for (int i = 0; i < nums.Length; i++)
{
sum += nums[i];
}
return sum;
}
}
134. 加油站
public class Solution {
public int CanCompleteCircuit(int[] gas, int[] cost) {
int curSum = 0;
int totalSum = 0;
int start = 0;
for(int i = 0;i < gas.Length;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. 分发糖果
思路:这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼。
public class Solution {
public int Candy(int[] ratings) {
int sum = 0;
int[] candy = new int[ratings.Length];
for(int i = 0;i < ratings.Length;i++)
{
candy[i] = 1;
}
for(int i = 1;i < ratings.Length;i++)
{
if(ratings[i] > ratings[i-1]) candy[i] = candy[i-1] + 1;
}
for (int i = ratings.Length - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1] ) {
candy[i] = candy[i] > candy[i + 1] + 1 ? candy[i] : candy[i + 1] + 1;
}
}
for(int i = 0;i < ratings.Length;i++)
{
sum+=candy[i];
}
return sum;
}
}