力扣 1005.K次取反后最大化的数组和
java
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
// 将基本类型的int数组转换成IntStream,以便进行流操作。
nums = Arrays.stream(nums)
// 将IntStream中的int元素转换(装箱)为Integer对象,这是必须的因为后面的sorted方法需要对象来进行比较。
.boxed()
// 对流中的元素进行排序。使用自定义的比较器,该比较器基于元素的绝对值进行降序排序。
// o1和o2是比较的两个元素,Math.abs(o2) - Math.abs(o1)计算结果如果为正数,则o2排在o1前面,实现降序。
.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
// 将流中的Integer对象转换回基本类型int,以便可以将流转换回数组。
.mapToInt(Integer::intValue)
// 将流中的元素收集到一个新的int数组中。
.toArray();
for(int i = 0; i < nums.length && k > 0; i++) {
if(nums[i] < 0) {
nums[i] = nums[i] * -1;
k--;
}
}
if(k == 0 || k % 2 == 0) {
return Arrays.stream(nums).sum();
}
else {
nums[nums.length - 1] = nums[nums.length - 1] * -1;
return Arrays.stream(nums).sum();
}
}
}
力扣 134. 加油站
java
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int[] res = new int[gas.length];
for(int i = 0; i < gas.length; i++) {
res[i] = gas[i] - cost[i];
}
if(Arrays.stream(res).sum() < 0) {
return -1;
}
else {
int idx = 0;
int sum = 0;
while(idx < res.length) {
int i;
for(i = idx; i < res.length; i++) {
sum += res[i];
if(sum < 0) {
sum = 0;
idx = i + 1;
break;
}
}
if(i == res.length) return idx;
}
}
return -1;
}
}
力扣 135. 分发糖果
java
class Solution {
public int candy(int[] ratings) {
int[] LToR = new int[ratings.length];
LToR[0] = 1;
for(int i = 1; i < ratings.length; i++) {
if(ratings[i] > ratings[i - 1]) {
LToR[i] = LToR[i - 1] + 1;
}
else {
LToR[i] = 1;
}
}
int[] RToL = new int[ratings.length];
RToL[ratings.length - 1] = 1;
for(int i = ratings.length - 2; i >= 0; i--) {
if(ratings[i] > ratings[i + 1]) {
RToL[i] = RToL[i + 1] + 1;
}
else {
RToL[i] = 1;
}
}
int[] result = new int[ratings.length];
for(int i = 0; i < ratings.length; i++) {
result[i] = Math.max(LToR[i], RToL[i]);
}
int sum = Arrays.stream(result).sum();
return sum;
}
}