算法奇妙屋(三十七)-贪心算法学习之路4

文章目录

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

1. 题目解析

2. 算法原理

3. 代码

java 复制代码
class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        int m = 0, ret = 0, n = nums.length;
        for (int i = 0; i < n; i++) {
            if (nums[i] < 0) {
                m++;
            }
        }
        if (m == k) {
            for (int num : nums) {
                if (num < 0) {
                    ret += -num;
                }else {
                    ret += num;
                }
            }
        }else if (m > k) {
            PriorityQueue<Integer> q = new PriorityQueue<>();
            for (int num : nums) {
                q.add(num);
            }
            for (int i = 0; i < k; i++) {
                q.add(-q.poll());
            }
            while(!q.isEmpty()) {
                ret += q.poll();
            }
        }else {
            PriorityQueue<Integer> q = new PriorityQueue<>();
            for (int num : nums) {
                ret += Math.abs(num);
                q.add(Math.abs(num));
            }
            if ((k - m) % 2 != 0) {
                ret -= 2 * q.poll();
            }
        }
        return ret;
    }
}

二. 力扣 2418. 按身高排序

1. 题目解析

对应的人名有对应的身高, 要求是身高排好序后, 其名字也得对应上

2. 算法原理

这里提供两种解法, 第一种解法较为简单, 但是使用的场景有限, 在身高相同名字不同的场景不适用, 而第二种解法是万金油

3. 代码

(1) 解法一

java 复制代码
class Solution {
    public String[] sortPeople(String[] names, int[] heights) {
        int n = names.length;
        HashMap<Integer, String> hash = new HashMap<>();
        String[] ret = new String[n];
        for (int i = 0; i < n; i++) {
            hash.put(heights[i], names[i]);
        }
        Arrays.sort(heights);
        for (int i = 0, j = n - 1; i < j; i++, j--) {
            int temp = heights[i];
            heights[i] = heights[j];
            heights[j] = temp;
        }
        for(int i = 0; i < n; i++) {
            ret[i] = hash.get(heights[i]);
        }
        return ret;
    }
}

(2) 解法二

java 复制代码
class Solution {
    public String[] sortPeople(String[] names, int[] heights) {
        int n = names.length;
        String[] ret = new String[n];
        Integer[] index = new Integer[n];
        for (int i = 0; i < n; i++) {
            index[i] = i;
        }
        Arrays.sort(index, (a, b) -> heights[b] - heights[a]);
        for(int i = 0; i < n; i++) {
            ret[i] = names[index[i]];
        }
        return ret;
    }
}

三. 力扣 870. 优势洗牌(田忌赛马)

1. 题目解析

该题意可以说和田忌赛马一个意思, 大于就得一分, 求最佳出场顺序

2. 算法原理

3. 代码

java 复制代码
class Solution {
    public int[] advantageCount(int[] nums1, int[] nums2) {
        int n = nums1.length;
        int[] ret = new int[n];
        int left = 0, right = n - 1;
        Integer[] index = new Integer[n];
        for (int i = 0; i < n; i++) index[i] = i;
        Arrays.sort(index, (a, b) -> nums2[a] - nums2[b]);
        Arrays.sort(nums1);
        for (int i = 0; i < n; i++) {
            if (nums1[i] > nums2[index[left]]) {
                ret[index[left++]] = nums1[i];
            }else {
                ret[index[right--]] = nums1[i];
            }
        }
        return ret;
    }
}
相关推荐
可编程芯片开发8 小时前
基于MATLAB的PEF湍流风场生成器模拟与仿真
算法
世人万千丶8 小时前
鸿蒙Flutter TextStyle样式配置
学习·flutter·harmonyos·鸿蒙
罗西的思考8 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (9)--- Reward Judging
人工智能·算法·机器学习
吃着火锅x唱着歌8 小时前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习
小弥儿9 小时前
GitHub今日热榜 | 2026-07-19
人工智能·学习·github·知识图谱
Mr.HeBoYan9 小时前
一次持续三天才出现的丢包故障——深入解析 DPDK Memory Ordering、rte_ring 与 CPU Memory Barrier (下)
linux·网络·算法·架构·dpdk
wabs66610 小时前
关于图论【深度优先搜索的理论基础】
算法·深度优先·图论
zhangrelay11 小时前
笔记本轻量高品质延寿工具完整分系统清单
运维·笔记·学习
巴巴媛66611 小时前
STM32学习笔记【38.DHT11实验】
笔记·stm32·学习
先吃饱再说11 小时前
LeetCode 101. 对称二叉树
算法