算法奇妙屋(三十七)-贪心算法学习之路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;
    }
}
相关推荐
菜菜的顾清寒2 分钟前
Leetcode (18) 力扣100 矩阵置零
算法
董董灿是个攻城狮10 分钟前
5分钟搞懂微调的能力退化问题
算法
fengci.14 分钟前
ctfshow其他(web408-web432)
android·开发语言·前端·学习·php
sensen_kiss23 分钟前
CPT306 Principles of Computer Games Design 电脑游戏设计原理 Pt.6 Gameplay 游戏玩法
学习·游戏
穿条秋裤到处跑28 分钟前
每日一道leetcode(2026.04.19):下标对中的最大距离
算法·leetcode·职场和发展
殷忆枫30 分钟前
AI学习笔记三十六:基于 YOLOv8 与 Qwen3.5 的多模态视频行为分析系统
笔记·学习·yolo
小陈phd34 分钟前
多模态大模型学习笔记(三十七)——模型管理平台实战:Ollama本地部署与全流程指南
笔记·学习
returnthem39 分钟前
使用trae 学习AI编程
学习·ai编程
网络安全实验室40 分钟前
【程序人生】程序员接私活常用平台汇总_嵌入式开发外包平台
网络·python·学习·程序人生·web安全·面试·职场和发展
Sag_ever40 分钟前
时间复杂度与空间复杂度超详细入门讲解
算法