【贪心算法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][]);
    }
}
相关推荐
2601_9707038322 分钟前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你021422 分钟前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi1 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang2 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!2 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法
维克兜率天3 小时前
【维克】指数调整:哪些股票会被“强制买入“?
人工智能·python·算法
罗西的思考4 小时前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
神也畏惧菠萝4 小时前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
揽星河..4 小时前
【C语言】分支和循环
c语言·c++·算法