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

 算法题

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.mfbz.cn/a/493291.html

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

相关文章

python和c语言的区别是什么

Python可以说是目前最火的语言之一了&#xff0c;人工智能的兴起让Python一夜之间变得家喻户晓&#xff0c;Python号称目前最最简单易学的语言&#xff0c;现在有不少高校开始将Python作为大一新生的入门语言。本萌新也刚开始接触Python&#xff0c;发现Python与其他语言确实有…

完全二叉树的层序遍历[天梯赛]

文章目录 题目描述思路 题目描述 输入样例 8 91 71 2 34 10 15 55 18 输出样例 18 34 55 71 2 10 15 91思路 完全二叉树最后一层可以不满&#xff0c;但上面的每一层的节点数都是满的 后序遍历的顺序为"左右根"&#xff0c;我们可以用数组模拟完全二叉树&#xff0c;…

Docker进阶:Docker Swarm —弹性伸缩调整服务的副本数量

Docker进阶&#xff1a;Docker Swarm —弹性伸缩调整服务的副本数量 1、 创建一个Nginx服务&#xff08;Manager节点&#xff09;2、查看服务状态&#xff08;Manager节点&#xff09;3、测试访问&#xff08;Worker节点&#xff09;4、查看服务日志&#xff08;Manager节点&am…

攻防世界逆向刷题

阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者 本人负责&#xff0c;作者不为此承担任何责任,如…

STM32学习笔记(7_2)- ADC模数转换器代码

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

PHP全自动采集在线高清壁纸网站源码

源码简介 集合360壁纸&#xff0c;百度壁纸&#xff0c;必应壁纸&#xff0c;简单方便。非常高清,支持全屏支持2K. 每天自动采集&#xff0c;自动更新&#xff0c;非常不错。 搭建环境 php5.6 Nginx 安装教程 上传源码压缩包到网站目录并解压即可 首页截图 源码下载 P…

深度学习基础入门:从数学到实现

I. 引言 A. 深度学习的背景 深度学习是机器学习的一个重要分支&#xff0c;是一种基于神经网络的算法&#xff0c;被广泛应用于计算机视觉、自然语言处理、语音识别等领域。与传统机器学习算法相比&#xff0c;深度学习具有更高的容错性、复杂性和精度&#xff0c;需要庞大的…

【Redis】Redis 介绍Redis 为什么这么快?Redis数据结构Redis 和Memcache区别 ?为何Redis单线程效率也高?

目录 Redis 介绍 Redis 为什么这么快&#xff1f; Redis数据结构 Redis 和Memcache区别 &#xff1f; 为何Redis单线程效率也高&#xff1f; Redis 介绍 Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据…

大白话扩散模型(无公式版)

背景 传统的图像生成模型有GAN&#xff0c;VAE等&#xff0c;但是存在模式坍缩&#xff0c;即生成图片缺乏多样性&#xff0c;这是因为模型本身结构导致的。而扩散模型拥有训练稳定&#xff0c;保持图像多样性等特点&#xff0c;逐渐成为现在AIGC领域的主流。 扩散模型 正如…

python第三次作业

1、求一个十进制的数值的二进制的0、1的个数 def count_0_1_in_binary(decimal_num):binary_str bin(decimal_num)[2:]count_0 binary_str.count(0)count_1 binary_str.count(1)return count_0, count_1decimal_number int(input("十进制数&#xff1a;")) zero…

linux 外部GPIO Watchdog驱动适配

前言 文章描述&#xff0c; 利用外部gpio看门狗芯片驱动芯片的复位功能。 芯片&#xff1a;RK3568 平台&#xff1a; Linux ubuntu.lan 4.19.232 #27 SMP Sat Sep 23 13:43:49 CST 2023 aarch64 aarch64 aarch64 GNU/Linux 硬件接线图示 看门狗芯片采用GPIO喂狗&#xff0c;W…

PTA L2-037 包装机

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道&#xff0c;放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时&#xff0c;活塞向左推动&#xff0c;将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时&#xff0c;机械手将抓取筐顶部的一件物品&#x…

unity 横版过关单向通行实现(PlatformEffector2D)

目录 前言一、什么是 PlatformEffector2D&#xff1f;二、使用步骤1.创建模型2.创建jump脚本3.PlatformEffector2D组件 三、效果总结 前言 在 2D 游戏中&#xff0c;处理角色与平台之间的交互是一个常见但复杂的任务。为了简化这一过程&#xff0c;Unity 提供了 PlatformEffec…

五分钟,零基础也能入门 Python 图像文字识别

一. 前言 最近在研究 Python 的一些功能 &#xff0c; 也尝试了一些有趣实现&#xff0c; 这一篇就从实践的角度来研究一下 Python 如何实现图片识别。 众所周知 &#xff0c; Python 的库真的老多了&#xff0c;其中在图像识别上比较突出的就是 OpenCV. 那么基于这个库我们…

有效三角形的个数【双指针】

1.优化版暴力求解 如果能构成三⻆形&#xff0c;需要满⾜任意两边之和要⼤于第三边。实际上只需让较⼩的两条边之和⼤于第三边即可。将原数组排序&#xff0c;从⼩到⼤枚举三元组&#xff0c;这样三层 for 循环枚举出的三元组只需判断较⼩的两条边之和是否⼤于第三边。 class…

新一代酒店智能客控方案亮相上海酒店展:力合微PLC技术推动酒店智能化升级

3月26日&#xff0c;2024上海国际酒店及商业空间博览会&#xff08;以下简称&#xff1a;上海酒店展&#xff09;于上海新国际博览中心开幕。作为行业领先的物联网通信芯片企业&#xff0c;22年专注于PLC&#xff08;电线通信&#xff09;技术及芯片&#xff0c;&#xff08;股…

代理与 XLogin 集成

代理与 XLogin 集成 通过将 Smartdaili 住宅代理与强大的 XLogin 反检测浏览器相匹配来解锁网络数据。 什么是 XLogin&#xff1f; XLogin 是一款防关联浏览器&#xff0c;具有多重指纹保护技术&#xff0c;可通过 Selenium 网络驱动程序实现任务自动化&#xff0c;并为每个…

变量,前世你也许是个过客!

很多书中喜欢将变量比喻成一个容器&#xff0c;比如盒子、碗之类的。但老金认为这个比喻有失妥当。按字面意思理解&#xff0c;变量只是一个可以改变的量&#xff0c;就像函数中的自变量x、因变量y一样。变量本身并不具有存储功能&#xff0c;有存储功能的是内存&#xff0c;所…

rmvb怎么转换为mp4?最简单方法!

各种文件格式层出不穷&#xff0c;而RMVB&#xff08;RealMedia Variable Bitrate&#xff09;格式作为一种独特的视频文件格式&#xff0c;其起源可以追溯到上世纪90年代。当时&#xff0c;随着数字视频的崛起&#xff0c;RealNetworks公司迎来了一项重要任务&#xff1a;提供…

【LVGL-平铺视图部件(lv_tileview)】

LVGL-平铺视图部件&#xff08;lv_tileview&#xff09; ■ LVGL-平铺视图部件&#xff08;lv_tileview&#xff09;■ 示例一&#xff1a;添加到行列中的位置&#xff08;1,0&#xff09;表示第1列第0行■ 示例二&#xff1a;滑动方向LV_DIR_RIGHT &#xff0c;LV_DIR_LEFT■ …
最新文章