day34贪心算法 part03

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

简单

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。
在这里插入图片描述

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        // 先按绝对值大到小排个序
        reverseAbsNms(nums);
        
        for (int i = 0; i < nums.length; i++) {
            //从前往后遍历,遇到负数将其变为正数,同时K--
            if (nums[i] < 0 && k > 0) { // K > 0也是个很重要的条件
                nums[i] = -nums[i];
                k--;
            }
        }
        // 如果K还大于0,那么反复转变数值最小的元素,将K用完
        if (k % 2 == 1) nums[nums.length - 1] = -nums[nums.length - 1];

        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }

        return sum;
    }

    public void reverseAbsNms(int[] nums) {
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = 0; j < nums.length - i - 1; j++) {
                if (Math.abs(nums[j]) < Math.abs(nums[j + 1])) { // 是j不是i !!!
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp; 
                }
            }
        }
    }
}

134. 加油站

中等
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

难点:总油量减去总消耗大于等于零为什么一定可以跑完一圈?i如果无法到j的话,那么i和j之间的点也无法到达j的理论,推不出来就背吧

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        // 考虑从每一个点出发 
        for (int start = 0; start < n; ) {
            if (gas[start] < cost[start]) {
                start++; // 这个点连到下一个点都做不到,换个点继续试
            } else {
                int remain = gas[start] - cost[start];
                int idx = start + 1;
                while (idx % n != start) {
                    remain += gas[idx % n] - cost[idx % n];
                    if (remain < 0) {
                        break;
                    }
                    idx++; 
                }
                if (idx % n == start) {
                        return start;
                    } else {
                        start = idx; // 就是那个i如果无法到j的话,那么i和j之间的点也无法到达j的理论,推不出来就背吧
                    }
            }
        }
        // 任何点都不可以
        return -1;
    }
}

135. 分发糖果

困难
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

/*
分两个阶段
1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
2、起点下标 ratings.length - 2 从右往左, 只要左边比右边大,此时 
左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,
这样才符合 它比它左边的大,也比它右边大
 */
class Solution {
    public int candy(int[] ratings) {
        int[] candyNums = new int[ratings.length];
        Arrays.fill(candyNums, 1);
        
        // 从前向后
        for (int i = 1; i < ratings.length; i++) {
            // 右比左大
            if (ratings[i] > ratings[i - 1]) candyNums[i] = candyNums[i - 1] + 1;
        }
        // 从后向前 
        int result = candyNums[ratings.length - 1];
        for (int i = ratings.length - 2; i >= 0; i--) {
            // 左比右大
            if (ratings[i] > ratings[i + 1]) {
                // 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,
                //这样才符合 它比它左边的大,也比它右边大
                candyNums[i] = Math.max(candyNums[i], candyNums[i + 1] + 1);
            }
            result += candyNums[i];
        }
        return result;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/428547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考57-上午题-【数据库】-数据库的控制功能

一、事务管理 1-1、事务的定义 事务是一个操作序列&#xff0c;这些操作&#xff0c;要么都做&#xff0c;要么都不做。 事务和程序是两个不同的概念&#xff0c;一般一个程序可以包含多个事务。 1-2、事务定义的语句 1、事务开始&#xff1a;BEGIN TRANSACTION 2、事务提…

LabVIEW齿轮传动健康状态静电在线监测

LabVIEW齿轮传动健康状态静电在线监测 随着工业自动化的不断发展&#xff0c;齿轮传动作为最常见的机械传动方式之一&#xff0c;在各种机械设备中发挥着至关重要的作用。然而&#xff0c;齿轮在长期运行过程中易受到磨损、变形等因素影响&#xff0c;进而影响整个机械系统的稳…

蓝桥杯集训·每日一题2024 (差分)

前言&#xff1a; 差分笔记以前就做了&#xff0c;在这我就不再写一遍了&#xff0c;直接上例题。 例题&#xff1a; #include<bits/stdc.h> using namespace std; int a[10009],b[100009]; int main(){int n,ans10,ans20;cin>>n;for(int i1;i<n;i){cin>>…

数字经济的新机遇:揭秘Web3的商业价值

引言&#xff1a; 随着技术的飞速发展和互联网的日益普及&#xff0c;数字经济已经成为了当今社会的重要组成部分。而在数字经济的蓬勃发展中&#xff0c;Web3技术被认为是一个颠覆性的力量&#xff0c;它不仅重新定义了数字世界的基础架构&#xff0c;还为商业创新带来了巨大…

嵌入式学习第二十四天!(进程间通信:消息队列、共享内存、信号灯)

进程间的通信&#xff1a; 消息队列、共享内存、信号灯&#xff1a; 1. IPC对象&#xff1a;内存文件 1. ipcs&#xff1a; 查看系统中的消息队列&#xff0c;共享内存、信号灯的信息 2. ipcrm&#xff1a; 删除消息队列、共享内存、信号灯 ipcrm -Q/-M/-S key ipcrm -q/-m/-s…

linux安装部署

jdk&tomcat安装 1.上传jdk、tomcat安装包 2.解压两个工具包 #解压tar -zxvf apache-tomcat-8.5.20.tar.gz#解压jdktar -zxvf jdk-8u151-linux-x64.tar.gz 3.配置并且测试jdk安装 #配置环境变量vim /etc/profile​#java environmentexport JAVA_HOME/soft/jdk1.8.0_151exp…

Whisper实现语音识别转文本

#教程 主要参考开源免费离线语音识别神器whisper如何安装&#xff0c; OpenAI开源模型Whisper——音频转文字 Whisper是一个开源的自动语音识别系统&#xff0c;它在网络上收集了680,000小时的多语种和多任务监督数据进行训练&#xff0c;使得它可以将多种语言的音频转文字。…

【学位论文】上海交通大学 研究生学位论文 本地保存

上海交大研究生学位论文网&#xff1a;http://thesis.lib.sjtu.edu.cn/ &#xff08;只能校内访问或SJTU VPN访问&#xff09; 如果希望下载论文&#xff0c;需要参考&#xff1a;https://github.com/olixu/SJTU_Thesis_Crawler 安装过程 安装过程的几个坑&#xff1a; &a…

【Java开发】Java实现调用微信机器人,发送企业微信通知

请直接看原文: 【Java开发】Java实现调用微信机器人&#xff0c;发送企业微信通知_java 企业微信推送机器人消息-CSDN博客 ------------------------------------------------------------------------------------------------------------------------------- 企业微信机器…

无需安装!7款一键在线UI设计利器

制作完原型后&#xff0c;需要优化界面。此时是UI设计师的任务。UI设计软件对设计师来说非常重要。UI设计工具的使用是否直接影响到最终结果的质量&#xff0c;所以有人会问:UI界面设计使用什么软件&#xff1f;这里有一些UI设计师和对UI设计感兴趣的朋友列出了五款好用免费的U…

Unity 动态加载音频和音效

想要加载音效和音频需要两个组件&#xff1a; 听&#xff1a; 播&#xff1a; 一收一发 在层级中&#xff0c;右键创建 音频源 &#xff0c;放入物体的子物体中。 播放 方式一 拖动需要播放的音频文件到&#xff0c;音频源组件中。 using System.Collections; using Syst…

java BIO

目录 Java BIO基本介绍 Java BIO工作机制 传统的BIO编程实例回顾 1、BIO模式下发送和接收消息 2、BIO模式下多发和多收消息 3、BIO模式下接收多个客户端 伪异步I/O编程 基于BIO形式下的文件上传 Java BIO模式下的端口转发思想 Java BIO基本介绍 Java BIO就是传统的jav…

Pytorch学习 day03(Tensorboard)

Tensorboard Tensorboard能够可视化loss的变化过程&#xff0c;便于我们查看模型的训练状态&#xff0c;也能查看模型当前的输入和输出结果 在Pycharm中&#xff0c;可以通过按住ctrl&#xff0c;并左键点击某个库来进入源文件查看该库的使用方法 SummaryWriter是用来向log_di…

C语言:指针(二)

目录 1.数组名的理解2.使用指针访问数组3.一维数组传参的本质4.二级指针5.指针数组6.字符指针变量7.数组指针变量8.二维数组传参的本质9.函数指针变量10.函数指针数组11.回调函数12.qsort函数13.使用回调函数模拟实现qsort函数 1.数组名的理解 int main() {int arr[] { 1,2,3…

上帝视角看GPU(5):图形流水线里的不可编程单元

【GPU】图形流水线基础【GPU】逻辑上的模块划分【GPU】部署到硬件【GPU】完整的软件栈 前几期我们过了一遍GPU的软硬栈。这次我们将深入GPU图形流水线的一些细节&#xff0c;看看那些不可编程的模块是怎么工作的。 对于GPU的图形流水线来说&#xff0c;最核心最重要的一个组件就…

通过人工智能增强的对话建立有意义的联系

人工智能如何重塑我们的交流&#xff1f;2024年最新对话AI趋势 在技术和人类互动比以往任何时候都更加复杂地交织在一起的时代&#xff0c;人工智能增强的对话已成为建立有意义的联系的关键要素。 这种转变不仅关乎效率&#xff0c;还关乎效率。 这是为了丰富沟通的结构。 在这…

MATLAB--pie函数绘制复杂分类饼图(2)--附案例代码

MATLAB–pie函数绘制复杂分类数据的饼状图 目录 MATLAB--pie函数绘制复杂分类数据的饼状图摘要1. 问题描述2. 具体步骤&#xff1a;3. 绘制结果4. 小结 摘要 在数据可视化中&#xff0c;饼状图是一种常用的展示分类数据的方式。之前&#xff0c;文章介绍了使用MATLAB绘制饼状图…

Vue中的计算属性和方法有什么区别?

Vue.js是一款流行的JavaScript前端框架&#xff0c;提供了丰富的功能和便捷的开发方式。在Vue中&#xff0c;计算属性和方法是常用的两种方式来处理数据和逻辑。但它们之间存在一些区别&#xff0c;本文将详细介绍Vue中计算属性和方法的区别&#xff0c;并通过示例代码加深理解…

654.最大二叉树

这段Java代码实现了一个名为Solution的类&#xff0c;其中包含两个方法&#xff1a;constructMaximumBinaryTree()和constructMaximumBinaryTree1()&#xff0c;目的是从给定的整数数组nums中构建出一个最大二叉树。以下是详细的注释说明&#xff1a; class Solution {// 主方…

GitHub Copilot extension activation error: ‘No access to GitHub Copilot found‘

好不容易学生认证通过了&#xff0c;打开vscode用copilot结果一直报这个错误。我的原因是&#xff1a;还未给copilot授权&#xff0c; 通过了学生认证后要进入这里进行授权&#xff1a;