算法奇妙屋(三十七)-贪心算法学习之路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;
    }
}
相关推荐
wefly20172 小时前
零基础上手m3u8live.cn,免费无广告的M3U8在线播放器,电脑手机通用
前端·javascript·学习·电脑·m3u8·m3u8在线播放
思茂信息2 小时前
基于 CST 的方向图可重构天线仿真分析
网络·人工智能·单片机·算法·重构·cst·电磁仿真
IronMurphy2 小时前
【算法三十三】17. 电话号码的字母组合
算法
逆境不可逃2 小时前
LeetCode 热题 100 之 131. 分割回文串 51. N 皇后
算法·leetcode·职场和发展
进击的小头2 小时前
第21篇:BUCK变换器双环控制系统设计与参数整定调试实战
python·算法
movigo7_dou2 小时前
SIFT的一些内容
论文阅读·图像处理·学习·计算机视觉
liliangcsdn2 小时前
信息检索评估指标Recall@K的分析和计算示例
算法·全文检索
handsomethefirst2 小时前
【算法与数据结构】【面试经典150题】【题36-题40】
数据结构·算法·面试
寒月小酒2 小时前
3.29+3.30
数据结构·算法
Flying pigs~~2 小时前
基于Bert的模型迁移文本分类项目
人工智能·深度学习·算法·大模型·nlp·bert