算法奇妙屋(三十七)-贪心算法学习之路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;
    }
}
相关推荐
洛水水4 小时前
【力扣100题】18.随机链表的复制
算法·leetcode·链表
爱看大明王朝15664 小时前
磁件学习-磁性元器件的极限计算
笔记·学习
南宫萧幕4 小时前
规则基 EMS 仿真实战:SOC 区间划分与 Simulink 闭环建模全解
算法·matlab·控制
东风破1374 小时前
DM8达梦共享存储集群DSC搭建步骤
数据库·学习·dm达梦数据库
多加点辣也没关系4 小时前
数据结构与算法|第二十三章:高级数据结构
数据结构·算法
星幻元宇VR5 小时前
VR科普大空间:沉浸式公共教育新模式
科技·学习·安全·vr·虚拟现实
hoiii1877 小时前
孤立森林 (Isolation Forest) 快速异常检测系统
算法
笨鸟先飞的橘猫7 小时前
MMO游戏中的“跨服团队副本”匹配与状态同步系统
分布式·学习·游戏·lua·skynet
c++之路8 小时前
适配器模式(Adapter Pattern)
java·算法·适配器模式
吴声子夜歌8 小时前
Java——接口的细节
java·开发语言·算法