Day34|1005.K次取反后最大化的数组和 |134. 加油站|135. 分发糖果

● 1005.K次取反后最大化的数组和

/*IntStream.of(nums) 将数组 nums 转换为一个 IntStream 对象。
boxed() 将 IntStream 对象转换为一个 Stream<Integer> 对象。
sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)):使用 sorted() 方法对 Stream<Integer> 中的元素进行排序。这里使用了一个自定义的比较器,该比较器首先按元素的绝对值从大到小排序,然后再按元素本身的大小排序。
mapToInt(Integer::intValue) 将 Stream<Integer> 对象中的元素转换为 IntStream 对象。
toArray() 将 IntStream 对象中的元素转换为一个 int 数组。
因为我们能够通过流中的sort方法来对元素进行自定义排序,所以要转换成流
​
Stream在java工程中是极其常见的
*/
class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
    nums = IntStream.of(nums)
    .boxed().sorted((o1,o2)->Math.abs(o2)-Math.abs(o1))
    .mapToInt(Integer::intValue).toArray();
    int len = nums.length;
    for(int i = 0;i<len;i++){
        if(nums[i]<0&&k>0){
            nums[i] = -nums[i];
            k--;
        }
    }
    //如果k还大于0,我们就要犯贱
    //判断k是不是偶数,是偶数的话,就一直对最小的一个数进行取反,这样我们的最后的结果的值
    if(k%2==1) nums[len-1] = -nums[len-1];
    return Arrays.stream(nums).sum();
    }
}
​

● 134. 加油站

/*
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。
*/
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
    int curSum = 0;
    int totalSum = 0;//totalSum是用来检测全程中加油量是否大于耗油量
    int index = 0;
    for(int i = 0;i<gas.length;i++){
        curSum += gas[i] - cost[i];
        totalSum += gas[i] - cost[i];
    if(curSum<0){
        index = (i+1)%gas.length;
        curSum = 0;
    }
    }
    if(totalSum<0) return -1;
    return index;//最后的index肯定是全局的希望
    }
}

● 135. 分发糖果

class Solution {
    public int candy(int[] ratings) {
    int len = ratings.length;
    int[] candy = new int[len];
    candy[0] = 1;
    for(int i =1;i<len;i++){
       candy[i] = (ratings[i]>ratings[i-1])?candy[i-1]+1:1;
    }
    for(int i = len-1;i>0;i--){
        candy[i-1] = (ratings[i-1]>ratings[i])?Math.max(candy[i]+1,candy[i-1]):candy[i-1];
    }//注意是否经过第一层for循环之后,比右边大的孩子是否本来拥有的糖果数就多余左边的
    int sum = 0;
    for(int i = 0;i<len;i++){
    sum += candy[i];
    }
    return sum;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值