当前位置: 首页 > news >正文

【贪心算法3】

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

链接: link

思路

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

方法1:

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

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

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

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

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][]);
    }
}

相关文章:

  • git设置本地仓库和远程仓库
  • 解决 word 2016 粘贴图片老是乱飘的问题
  • 十分钟用DeepSeek v3快速搭建企业级本地私有知识库(保姆级教程),AI终于私有化了!
  • Java糊涂包(Hutool)的安装教程并进行网络爬虫
  • 训练大模型LLM选择哪种开发语言最好
  • 2.3 DeepSeek SDK接入与鉴权体系设计
  • RabbitMQ (Java)学习笔记
  • electron+vue+webview内嵌网页并注入js
  • Android Glide 框架线程管理模块原理的源码级别深入分析
  • 第七次CCF-CSP认证(含C++源码)
  • 微前端最佳实践:Module Federation 的使用步骤详解
  • OmniParser技术分析(一)
  • c++ constraints与concepts使用笔记
  • 搜广推校招面经四十三
  • 使用 React 和 Ant Design 处理 Excel 和 CSV 文件
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(27)混元幡遮天机 - 第一个错误版本(二分边界)
  • Java 学习记录:基础到进阶之路(一)
  • 如何实现pinia的持久化存储
  • 前端项目 Node.js 与 node-sass 版本兼容问题
  • Linux rpcbind漏洞
  • “非思”的思想——探索失语者的思想史
  • 49:49白热化,美参议院对新关税政策产生巨大分歧
  • 烟花秀、新航线、购物节......上海邮轮文化旅游节今日开幕
  • 看展览|建造上海:1949年以来的建筑、城市与文化
  • 演员刘美含二手集市被曝售假,本人道歉
  • 稳就业稳经济五方面若干举措将成熟一项出台一项