算法打卡day29|贪心算法篇03|Leetcode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

news2024/11/17 6:43:46

 算法题

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

题目链接:1005.K次取反后最大化的数组和

 大佬视频讲解:K次取反后最大化的数组和视频讲解

 个人思路

思路清晰,因为是取反当然是取越小的负数越好,那么先按绝对值排序。如果是负数就取反,相应取反次数减一,遍历到没有负数后还有取反次数就选绝对值最小的值取反剩下的次数,最后数组和就是最大的,也是局部最优求全局最优的结果,可以用贪心

解法
贪心法

按照贪心法的步骤来解题,步骤为:

  • 第一步:将数组按照绝对值大小从大到小排序
  • 第二步:从前向后遍历,遇到负数将其变为正数,同时K--
  • 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
  • 第四步:求和

class Solution {
    public int largestSumAfterKNegations(int[] nums, int K) {

	nums = IntStream.of(nums) //创建了一个原始类型 int 的流
		     .boxed()//将流中的int值装箱成Integer对象
		     .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))//按绝对值大小排序
		     .mapToInt(Integer::intValue).toArray();//转回int[] 类型的数组

	int len = nums.length;	    
	for (int i = 0; i < len; i++) {
	    //从前向后遍历,遇到负数将其变为正数,同时K--
	    if (nums[i] < 0 && K > 0) {
	    	nums[i] = -nums[i];
	    	K--;
	    }
	}
	// 如果K还大于0,那么反复转变数值最小的元素,将K用完
	if (K % 2 == 1) nums[len - 1] = -nums[len - 1];
	return Arrays.stream(nums).sum();

    }
}

时间复杂度:O(n log n);(排序操作的时间复杂度是 n log n)

空间复杂度:O(n);(代码使用了额外的数组来存储排序后的结果)


 Leetcode  134. 加油站

题目链接:134. 加油站

大佬视频讲解:加油站视频讲解

个人思路

首先总油量减去总消耗大于等于零那么一定可以跑完一圈,找起点就从头遍历,油减油耗如果有负数就当前遍历点加1,重新计算,直到遍历完总油耗还是大于0;

解法
贪心法

首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,也就是各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。

每个加油站的剩余量rest[i]为gas[i] - cost[i]。

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum,i+1后面如果出现更大的负数,就是更新i,那么起始位置又变成新的i+1了

局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置。局部推全部,贪心!

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int curSum = 0;//当前油耗
        int totalSum = 0;//全部油耗
        int index = 0;//起点

        for (int i = 0; i < gas.length; i++) {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];

            if (curSum < 0) {
                index = (i + 1) % gas.length ; //更换新起点
                curSum = 0;
            }
        }
        if (totalSum < 0) return -1;
        return index;
    }
}

时间复杂度:O(n);(遍历整个数组)

空间复杂度:O(1);(常量级的变量)


 Leetcode  135. 分发糖果

题目链接:135. 分发糖果

大佬视频讲解:分发糖果视频讲解

 个人思路

到底是一起算还是分开计算呢?思路不清晰...

解法
贪心法

这道题目一定是要确定一边之后,再确定另一边,先比较每一个孩子的左边,然后再比较右边如果两边一起考虑一定会顾此失彼

先确定右边评分大于左边的情况,比较左孩子(从前向后遍历),确定分发糖果的第一个数组

再确定左孩子大于右孩子的情况,比较右孩子(从后向前遍历),对前一个数组优化,比较右孩子增加糖果的同时也要比交上一个数组的糖果值,二者取最大的.

具象化代码步骤就是分两个阶段
         1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
         2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大

class Solution {
    public int candy(int[] ratings) {
        int len = ratings.length;
        int[] candyNums = new int[len];

        candyNums[0] = 1;//初始化第一个孩子糖果数

        for (int i = 1; i < len; i++) {//从左往右,比左孩子
            candyNums[i] = (ratings[i] > ratings[i - 1]) ? candyNums[i - 1] + 1 : 1;
        }

        for (int i = len - 2; i >= 0; i--) {//从右往左,比右孩子
            if (ratings[i] > ratings[i + 1]) {
                candyNums[i] = Math.max(candyNums[i], candyNums[i + 1] + 1);//取最大糖果数
            }
        }

        int ans = 0;
        for (int num : candyNums) {//累加和
            ans += num;
        }
        return ans;
    }
}

时间复杂度:O(n);(遍历两遍整个数组)

空间复杂度:O(n);(暂存数组大小)


 以上是个人的思考反思与总结,若只想根据系列题刷,参考卡哥的网址代码随想录算法官网

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat 下载以及安装

Tomcat安装及配置教程主要分为四步&#xff1a; 步骤一&#xff1a;首先确认自己是否已经安装JDK 1. cmd&#xff1a;查看java的版本 步骤二&#xff1a;下载安装Tomcat 1. 下载tomcat :Apache Tomcat - Welcome! 2. 选择对应的tomcat版本&#xff1a; 3. 进行安装&#…

左值引用、右值引用及移动语义

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 左值 概念 可以取到地址的值就是左值&#xff0c;并且一般情况下可以修改&#xff08;const类型左值不可修改&#xff09;。 左值举例&#xff1a; //左值 int a 0; const int b 1; int* p &a; 右值 概念 不能…

虚拟ECU:汽车空调压缩机控制系统

2024年是“十四五”的“关键一年”&#xff0c;在中国居民生活水平不断上升的趋势下&#xff0c;人们对汽车的需求已不再局限于简单的代步工具&#xff0c;而对其整体的舒适度和体验度也有着越来越高的要求。作为提升驾车与乘车体验的重要部分&#xff0c;汽车的空调系统在电动…

3D软件坐标系速查

本文介绍不同3D软件的世界坐标系之间的差异及其工作原理。 基本上&#xff0c;游戏引擎和3D软件包最重要的问题是根据软件的坐标轴系统创建资产&#xff0c;正确缩放它们并根据要完成的工作设置枢轴系统。 坐标系正确性的定义可能会根据模型导入的游戏引擎或 3D 软件而变化。…

Python Flask-Mail实现邮件发送

一、邮件发送的扩展 关于如何找到flask发送邮件的插件&#xff1f;&#xff0c;上一篇已经分享了如何找到第三方插件&#xff0c;也找到了插件flask-mail的使用文档&#xff0c;那我们就来实战吧 二、根据文档&#xff0c;总结发送邮件的流程 从文档中可以总结出发送邮件的步…

【JavaScript】JavaScript 程序流程控制 ⑦ ( do-while 循环概念 | do-while 循环语法结构 )

文章目录 一、while 循环1、while 循环概念2、do-while 循环语法结构 二、do-while 循环代码示例1、打印 1-5 数字2、打印 1-10 累加和 一、while 循环 1、while 循环概念 JavaScript 中的 do-while 循环 是 while 循环的变体 , 是 一种 后测试 循环 , 该循环的 循环体 至少执行…

Lazada、shopee自养号测评环境搭建需要准备哪些?

在如今电商竞争日益激烈的环境下&#xff0c;卖家们深知流量对店铺转化率的至关重要性。依赖平台内部的流量已不再足够&#xff0c;越来越多的卖家开始探索其他方式来提升销售业绩和品牌知名度。其中&#xff0c;自养号测评成为了一种备受关注的策略&#xff0c;通过搭建独立运…

零基础自学C语言|文件操作

✈为什么使用文件&#xff1f; 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化…

OSPF-区域间路由计算

一、概述 前面学习了我们学习了Router-LSA和Network-LSA&#xff0c;它们都只能在区域内进行泛洪&#xff0c;而且我们之前一直主要是单区域学习。OSPF的核心是骨干区域Area 0&#xff0c;其它都为非骨干区域。但是在大型网络中&#xff0c;单区域OSPF会存在一定的问题&#xf…

Hack The Box-Headless

目录 信息收集 nmap whatweb WEB web信息收集 dirmap 可利用点分析 xss攻击 RCE漏洞 提权 get user get root 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.8 --min-rate 10000 …

使用docker-compose搭建wordpress博客

1、从远程仓库拉取worldpress镜像到本地 2、新建一个项目&#xff0c;然后在新建的项目目录里面新建一个docker-compose.yml模版文件。 3、编写docker-compose.yml文件 4、docker-compose up 运行项目。 5、在浏览器测试 使用docker-compose搭建wordpress博客实验成功。

三相四线智能电表直接接入式接线图

大家好&#xff0c;今天我们要聊的是三相四线智能电表的直接接入式接线方式。别担心&#xff0c;我会用简单易懂的语言来解释这个看似复杂的主题。 首先&#xff0c;我们得知道什么是三相四线电表。在我们的生活中&#xff0c;电力供应通常分为单相和三相。三相电&#xff0c;就…

Python中的数据类型有四类八种如何理解?

在Python中&#xff0c;数据类型大致可以分为四大类&#xff0c;包含了八种基本的数据类型&#xff0c;这些分类有助于理解和使用Python进行编程。这四大类分别是&#xff1a; 数字类型 (Numeric Types): 整型 (int): 表示没有小数部分的整数&#xff0c;可以是正数、负数或零。…

【爬虫基础】第2讲 使用Urllib库创建第一个爬虫程序

Urllib 是 Python 的标准库&#xff0c;它提供了一系列用于处理 URL 的函数和类&#xff0c;包括发送 HTTP 请求、处理 HTTP 响应、解析 URL 等功能。可以使用 urllib 来编写简单的网络爬虫。 request&#xff1a;它是最基本的HTTP请求模块&#xff0c;可以用来模拟发送请求。只…

如何利用OpenCV4.9离散傅里叶变换

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:如何利用OpenCV4.9 更改图像的对比度和亮度 下一篇: 目标 我们将寻求以下问题的答案&#xff1a; 什么是傅里叶变换&#xff0c;为什么要使用它&#xff1f;如何在 OpenCV 中做到这一点…

Spring6 (1)

Spring 1、简介&#xff1a;2、第一个程序2、set注入2.1 简单数据类型2.2测试2.3 注入Properties2.4 p命名空间注入2.5 c命名空间注入2.6 util注入2.6 引入外部配置文件 1、简介&#xff1a; 自己的理解&#xff1a;spring其实就是一个容器&#xff0c;也可以说是一个框架&…

腾讯云轻量4核8G12M服务器配置4C8G12M详解

4核8G是云服务器的参数&#xff0c;代表云服务器的硬件配置和网络带宽&#xff0c;4核代表CPU、8G是指内存、12M代表带宽值为12Mbps&#xff0c;腾讯云百科txybk.com以腾讯云轻量应用服务器4核8G12M带宽配置为例&#xff0c;来详细介绍下服务器参数&#xff1a; 4c8g是什么意思…

高阶数据结构 <红黑树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文红黑树简介红黑树整体结构红黑树节点的定义红黑树主体类设计红黑树的插入函数情况一&#xff1a;变色情况二&#xff1a;变色旋转单旋情况双旋情况 完整插入代码 关于红黑树红黑树检…

鸿蒙OS实例:同步获取应用配置的【versionCode和versionName】

1.同步方式获取 首先需要导包&#xff1a; import bundleManager from ohos.bundle.bundleManager 工具类&#xff1a; public static async getVersionName(): Promise<string> {try {let bundleInfo await bundleManager.getBundleInfoForSelf(bundleManager.Bundle…

树状数组及应用

目录 1.树状数组的概念与基本编码 1.1.引导 1.2.lowbit(x) 1.3.树状数组的编码 2.树状数组的基本应用 2.1.单点修改&#xff0b;区间查询 2.2.区间修改单点查询 例题&#xff1a; 2.3.区间修改&#xff0b;区间查询 例题&#xff1a; 如果数列A是静态不变的&#xff…