代码随想录第三十四天

代码随想录第三十四天

    • [Leetcode 1005. K 次取反后最大化的数组和](#Leetcode 1005. K 次取反后最大化的数组和)
    • [Leetcode 134. 加油站](#Leetcode 134. 加油站)
    • [Leetcode 135. 分发糖果](#Leetcode 135. 分发糖果)

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

题目链接 : K 次取反后最大化的数组和
自己的思路:没想出来!!!真的懒!!!

正确思路:两次贪心,第一次是先把数据按绝对值顺序排个序,然后从头开始找小于0的数,依次将它们转换为正数,找到一个负数,k就减减,遍历完数组,第二次贪心,如果k还剩下值,如果为奇数的话,就把最后一个数来回取负数,但实际就是取一次负数就可以,如果为偶数的话,则不需要变动;最后把数组中的数加起来就可以!!!

代码:

javascript 复制代码
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();
        //遍历数组,有负数转化为正数
        for (int i=0;i<nums.length;i++){
            if (nums[i]<0&&k>0){ 
                nums[i] = -nums[i];
                k--;
            }
        }
        //当k为奇数的时候,找最小的数把他变为负的
        if (k%2==1) nums[nums.length-1] = -nums[nums.length-1];
        int result = 0;
        for (int num:nums){
            result += num;
        }
        return result;
    }
}

复杂度分析

时间复杂度: O ( n ) \mathcal{O}(n) O(n)

空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 134. 加油站

题目链接 : 加油站
自己的思路:真的难想,第一遍根本想不到!!!!

正确思路 :这题贪心就贪在能走完全程!我们可以模拟从第0个加油站就当做起点的时候,然后依次把自己得到的油和消耗的油相减,并做加和统计,如果这个和小于0了,说明没法再往前走了,然后把这个加和置为0,使用start记录一下当前索引的下一个位置,因为我们要从下一个位置开始走,因为前面的一段区间都没法当做起点,然后一直循环往复,在整个遍历的过程中,我们将所有得到的油减去所有消耗的油,如果说最后这个值小于0,说明没法走到终点,否则的话我们就把前面记录的start返回即可!!!
代码:

javascript 复制代码
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        //记录前面区间的剩下的油
        int result = 0;
        //记录最后剩下的油
        int total = 0;
        //记录下一个索引
        int start = 0;
        for (int i =0;i<gas.length;i++){
            result += gas[i]-cost[i];
            total += gas[i]-cost[i];
            if (result<0){
                result = 0;
                start = i+1;
            }
        }
        if (total<0) return -1;
        return start;
    }
}

复杂度分析

时间复杂度: O ( n ) \mathcal{O}(n) O(n)

空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 135. 分发糖果

题目链接 : 分发糖果
自己的思路:根本想不到!!!

正确思路:贪心:不要两边一起处理,先处理一边!!先考虑一种情况:当右边的孩子的得分大于左边孩子的得分情况,这种情况我们要从左向右遍历,当右边的孩子的得分大于左边孩子的得分,我们令右边孩子的得分是左边孩子的糖果树+1,否则令他糖果树为1;然后考虑第二种情况:左边孩子得分大于右边孩子的得分,这种情况我们要从右向左遍历,这次遍历时候的赋值和原来就不太一样了,如果左边孩子得分大于右边孩子的得分,那么当前左边孩子的糖果树我们要在右边孩子糖果数+1和从左到右遍历的糖果数之间取一个最大值,因为我们要兼顾两次循环,两个条件都必须满足!!!

代码:

javascript 复制代码
class Solution {
    public int candy(int[] ratings) {
        int[] candy = new int[ratings.length];
        candy[0] = 1;
        //从左到右遍历
        //右大于左的情况
        for (int i =1;i<ratings.length;i++){
            if (ratings[i]>ratings[i-1]){
                candy[i] = candy[i-1]+1;
            }else{
                candy[i] = 1;
            }
        }
        //从右到左遍历
        //左大于右的情况
        for (int i =ratings.length-2;i>=0;i--){
            if (ratings[i]>ratings[i+1]){
                candy[i] = Math.max(candy[i+1]+1,candy[i]);
            }
        }
        int result = 0;
        for (int num:candy){
            result += num;
        }
        return result;
    }
}

复杂度分析

时间复杂度: O ( n ) \mathcal{O}(n) O(n)

空间复杂度: O ( n ) \mathcal{O}(n) O(n)

相关推荐
JavaGuide4 分钟前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261354 分钟前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源6 分钟前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
CoovallyAIHub39 分钟前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
Java中文社群1 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心1 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
间彧1 小时前
Spring Boot项目中如何自定义线程池
java
间彧1 小时前
Java线程池详解与实战指南
java
用户298698530142 小时前
Java 使用 Spire.PDF 将PDF文档转换为Word格式
java·后端
NAGNIP2 小时前
Serverless 架构下的大模型框架落地实践
算法·架构