【贪心算法3】

力扣1005.k次取反后最大化的数组和

链接: link

思路

既然要求最大和,那么不妨先给数组排个序,如果有负数,先处理负数从前往后给数组取反,如果负数处理完后k还有次数,此时数组全是正数了,只需要对第一个元素取反即可,无非就是奇数次或者偶数次取反操作。最终求和即可。

方法1:

javascript 复制代码
class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        if (nums.length == 1)
            return nums[0];
        int ans = 0;
        Arrays.sort(nums);
        // 先处理负数
        for (int i = 0; i < nums.length && k > 0; i++) {
            if (nums[i] < 0) {
                nums[i] = -nums[i];
                k--;
            }
        }
        // 如果k还有次数
        if (k % 2 == 1) {
            Arrays.sort(nums);
            nums[0] = -nums[0];
        }
        for (int num : nums) {
            ans += num;
        }
        return ans;
    }
}

相似题型

134.加油站

链接: link

javascript 复制代码
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int start = 0;
        int curSum = 0;
        int totalSum = 0;
        for (int i = 0; i < gas.length; i++) {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            // 如果出现汽油小于使用量
            if (curSum < 0) {
                start = i + 1;
                curSum = 0;
            }
        }
        // 总共gas < cost 一定不能跑完一圈
        if (totalSum < 0) {
            return -1;
        }
        return start;
    }
}

135.分发糖果

链接: link

javascript 复制代码
class Solution {
    public int candy(int[] ratings) {
        int res = 0;
        int[] candyList = new int[ratings.length];
        Arrays.fill(candyList, 1);

        // 从左向右比较左孩子
        for (int i = 1; i < ratings.length; i++) {
            if (ratings[i] > ratings[i - 1]) {
                candyList[i] = candyList[i - 1] + 1;
            }
        }
        // 从右向左比较右孩子
        for (int i = ratings.length - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1]) {
                candyList[i] = Math.max(candyList[i], candyList[i + 1] + 1);
            }
        }
        for (int c : candyList) {
            res += c;
        }
        return res;
    }
}

860.柠檬水找零

链接: link

javascript 复制代码
class Solution {
    public boolean lemonadeChange(int[] bills) {
        int m5 = 0, m10 = 0;
        for (int i = 0; i < bills.length; i++) {
            if (bills[i] == 5) {
                m5++;
            } else if (bills[i] == 10) {
                m10++;
                m5--;
            } else if (bills[i] == 20) {
                if (m10 != 0) {
                    m10--;
                    m5--;
                } else {
                    m5 -= 3;
                }
            }
            if (m5 < 0 || m10 < 0) {
                return false;
            }
        }
        return true;
    }
}

406.根据身高重建队列

链接: link

javascript 复制代码
class Solution {
    public int[][] reconstructQueue(int[][] people) {
        // 对身高排序
        Arrays.sort(people, (a, b) -> {
            if (a[0] == b[0])
                return a[1] - b[1]; // a-b 是升序排列,按照k升序
            return b[0] - a[0];// 否则按照身高降序排列
        });
        List<int[]> que = new ArrayList<>();
        for (int i = 0; i < people.length; i++) {
            que.add(people[i][1], people[i]);
        }
        return que.toArray(new int[people.length][]);
    }
}
相关推荐
Jerry7 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发8 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星8 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮8 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home84078 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>9 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC10 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC10 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师10 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水10 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试