算法奇妙屋(三十七)-贪心算法学习之路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;
    }
}
相关推荐
Frostnova丶13 小时前
【算法笔记】数学知识
笔记·算法
xqqxqxxq13 小时前
哈希表(HashMap)技术学习笔记
笔记·学习·散列表
生而为虫13 小时前
[学习记录] 幼儿学习拼音html游戏
学习·游戏
吴可可12313 小时前
AutoCAD 2016与2014二次开发关键差异
算法
AOwhisky13 小时前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
xian_wwq14 小时前
【学习笔记】「大模型安全:攻击面演化史」第 07 篇-安全左移
人工智能·笔记·学习
秋雨梧桐叶落莳14 小时前
iOS——NSUserDefaults学习
学习·macos·ios·objective-c·cocoa
雨白14 小时前
哈希:以时间换空间的算法实战
算法
易小染15 小时前
AI-Agent学习-LangChain-01
学习·langchain