1005.K次取反后最大化的数组和
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
int sum = 0;
Arrays.sort(nums);
int i = 0;
for(;i < k && i < nums.length;i++){
if(nums[i] < 0)nums[i] = -nums[i];
else break;
}
if(i == k){
for(int j = 0;j < nums.length;j++){
sum += nums[j];
}
}else{
Arrays.sort(nums);
for(;i < k;i++){
nums[0] = -nums[0];
}
for(int j = 0;j < nums.length;j++){
sum += nums[j];
}
}
return sum;
}
}
● 134. 加油站●
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
//总油量小于需要的油料,肯定开不完
int sum = 0;
int min = 0;
for(int i = 0;i < gas.length;i++){
sum += gas[i] - cost[i];
min = Math.min(min,sum);
}
if(sum < 0)return -1;
if(min >= 0)return 0;
for(int j = gas.length - 1;j > 0;j--){
min += gas[j] - cost[j];
if(min >= 0)return j;
}
return -1;
}
}
解法2
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int restSum = 0;
int sum = 0;
int start = 0;
for(int i = 0;i < gas.length;i++){
restSum += gas[i] - cost[i];
sum += gas[i] - cost[i];
if(restSum < 0){
restSum = 0;
start = i + 1;
}
}
if(sum < 0)return -1;
else return start;
}
}
135. 分发糖果
class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
if(len == 1)return 1;
int sum = 0;
int[] candy1 = new int[len];
int[] candy2 = new int[len];
Arrays.fill(candy1,1);
Arrays.fill(candy2,1);
for(int i = 1;i < len;i++){
if(ratings[i] > ratings [i - 1])candy1[i] = candy1[i - 1] + 1;
}
for(int i = len - 2;i >= 0;i--){
if(ratings[i] > ratings[i + 1]){
candy2[i] = candy2[i + 1] + 1;
}
}
for(int i = 0;i < len; i++){
candy2[i] = candy1[i] > candy2[i] ? candy1[i] : candy2[i];
sum += candy2[i];
}
return sum;
}
}