day34【代码随想录】贪心算法之跳跃游戏、跳跃游戏||、K次取反后最大化的数组和

news2024/9/22 17:31:09

文章目录

  • 前言
  • 一、跳跃游戏(力扣55)
  • 二、跳跃游戏 II(力扣45)
  • 三、K次取反后最大化的数组和(力扣1005)


前言

1、跳跃游戏
2、跳跃游戏||
3、K次取反后最大化的数组和


一、跳跃游戏(力扣55)

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。
在这里插入图片描述
思路:
这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。
那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!
在这里插入图片描述
i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。

而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。

如果cover大于等于了终点下标,直接return true就可以了。

class Solution {
    public boolean canJump(int[] nums) {
        int cover =0;
        if(nums.length==1){
            return true;
            
        }
        if(nums[0]==0) return false;
        for(int i=0;i<=cover;i++){
            int count = i+nums[i];
            cover = Math.max(cover,count);
            if(cover>=nums.length-1){
                return true;
            }
        }
        return false;
    }
}

在这里插入图片描述

二、跳跃游戏 II(力扣45)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
在这里插入图片描述

思路:
本题相对于55.跳跃游戏还是难了不少。
关键是思考什么时候将步数 +1。假设跳的每一个台阶都是最优的(初始是在第 0 个台阶上),那么下一次选择在哪里跳的范围是在当前台阶上可以跳的全部范围 [i+1, i + nums[i]]。也就是说要在这一个范围内贪心的选一个能到达最远的台阶。
在这里插入图片描述

class Solution {
    public int jump(int[] nums) {
        int res = 0;
        if(nums.length==1||nums.length==0||nums==null)
            return res;
        int curDistance = 0;//当前覆盖的最大区域
        int maxDistance = 0;//最大的覆盖区域
        for(int i=0;i<nums.length;i++){
            int count = i+nums[i];
            maxDistance = Math.max(count,maxDistance);
            if(maxDistance>=nums.length-1){
                res++;
                break;
            }
            if(i==curDistance){
                res++;
                curDistance=maxDistance;
            }
        }
        return res;
    }
}

在这里插入图片描述

三、K次取反后最大化的数组和(力扣1005)

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

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

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

思路:
贪心的思路,局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。

局部最优可以推出全局最优。

那么如果将负数都转变为正数了,K依然大于0,此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。

那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        for(int i=k;i>0;i--){
            nums[0]=-1*nums[0];
            Arrays.sort(nums);
        }
        int res =0;
        for(int i=0;i<nums.length;i++){
            res += nums[i];
        }
        return res;
    }
}

这个解法时间复杂度有点高,因为执行了k次快排
题解的解法:

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        if(nums.length==1) return k%2==0?nums[0]:-nums[0];
        Arrays.sort(nums);
        int sum =0;
        int idx = 0;
        for(int i=0;i<k;i++){
            if(i<nums.length-1 && nums[idx]<0){
                nums[idx]=-nums[idx];
                if(nums[idx]>=Math.abs(nums[idx+1]))
                    idx++;
                continue;
            }
            nums[idx]=-nums[idx];
        }
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
        }
        return sum;
    }
}

在这里插入图片描述


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

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

相关文章

火热的低代码到底是什么?

低代码风头正紧&#xff0c;也是最近一段时间跟云原生一起被热捧&#xff0c;不管你是做后端开发、还是前端设计、销售、售前&#xff0c;如果你没接触过低代码你都不好意思说自己在软件领域工作&#xff0c;这边文章从我的角度聊聊低代码是什么、以怎么样的方式开发、及低代码…

react笔记_05函数组件与类组件的区别之capture value特性

函数组件与类组件在写法没有好坏之分&#xff0c;性能差距也几乎可以忽略&#xff0c;而且 React 会长期支持这两种写法。 React的函数式组件和类组件之间的根本区别 在心智模型上。 函数式组件具有 capture value 特性。 capture value特性 Capture Value 从字面上可以理解…

【已解决】office提示你的许可证不是正版,你可能是盗版软件的受害者?

三步即可先看效果步骤1、下载工具2、找到 修复Office许可证明问题3、填入KMS主机&#xff0c;点击修复如何查看正在使用的 KMS 主机地址&#xff1f;先看效果 步骤 1、下载工具 工具下载&#xff1a;https://otp.landian.vip/zh-cn/ 2、找到 修复Office许可证明问题 3、填入…

PEM格式RSA密钥解析(一)

Base64转16进制格式 后缀是.PEM 的数字证书是 BASE64 编码的&#xff0c;以 ASCII 码来表示。常见的证书如下所示&#xff08;以 RSA1024 为例&#xff09;&#xff1a; 私钥&#xff1a; ----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgHU4CF6yvqb5WBhwcYfvh/o3NpwcSJlcfj0nIZ…

下载神器IDM安装与使用(保姆级教程)

下载神器IDM安装与使用&#xff08;保姆级教程&#xff09; 文章目录下载神器IDM安装与使用&#xff08;保姆级教程&#xff09;前言一、下载地址二、IDM是什么&#xff1f;三、作用与特点四、安装步骤总结前言 众所周知&#xff0c;下载工具是大家电脑里必装的软件之一。 但大…

大数据时代,制造业人要知道,为什么有ERP还要上SRM系统

每个公司都是在一个供应链中&#xff0c;每个公司都有自己的上下游。如今&#xff0c;企业间的竞争已不再是单一企业的单打独斗&#xff0c;而是由价值链与价值链、供应链与供应链的较量。上游厂商&#xff08;供应商&#xff09;直接影响到公司的产品与服务的价格及竞争能力。…

零售企业全域数据打通最佳实践

在数字化转型的实战中&#xff0c;零售企业面临着巨大的挑战&#xff0c;过去三年线下流量锐减&#xff0c;甚至不少门店关停&#xff0c;不少零售企业布局线上&#xff0c;但是这个也给零售企业带来另外一个挑战&#xff1a;IT资源有限的情况下&#xff0c;线上&线下的流量…

密码学_RC4算法

在密码学中&#xff0c;RC4&#xff08;来自Rivest Cipher 4的缩写&#xff09;是一种流加密算法&#xff0c;密钥长度可变。它加解密使用相同的密钥&#xff0c;因此也属于对称加密算法。RC4是有线等效加密&#xff08;WEP&#xff09;中采用的加密算法&#xff0c;也曾经是TL…

电脑看不了视频?视频恢复,3个方案解决

一般电脑播放不了视频&#xff0c;原因大多是Flash插件损坏了&#xff0c;因为电脑上的视频和所有的Flash都需要Flash插件才可以正常使用。电脑看不了视频怎么办&#xff1f;你需要对Flash进行修复或者重新安装它。一起来看看下面三个方案&#xff0c;解决电脑视频看不了的问题…

传输系统WSON倒换时的路由震荡问题【脱敏版】

【摘要】在省干传输OXC系统中使用WSON倒换时&#xff0c;测试过程中发现WSON倒换时存在电路频繁up down的现象&#xff0c;研究发现倒换时光信道建立时间过程中光信号不是一个稳定的状态&#xff0c;设备的色散补偿模块会在这个不稳态下出现异常&#xff0c;导致色散补偿模块不…

2023,出海企业,数据跨境传输如何实现合规?

随着防疫政策的优化&#xff0c;2023年出海企业开始加速海外业务&#xff0c;此前&#xff0c;浙江、四川、广东、江苏等地政府都纷纷出手“包机出海抢订单“。而伴随着企业的全球业务拓展&#xff0c;数据跨境活动日益频繁&#xff0c;跨境数据的安全风险也日益凸显&#xff0…

通过反射机制调用方法

package com.javase.reflect;import com.javase.service.UserService;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ResourceBundle;/*** 通过反射机制调用方法&#xff08;必须掌握&#xff0c;五颗星*****&#…

小程序开发经验分享(2)前端开发

一、开发前的准备 开发环境:微信推出的官方开发工具。 申请 Appid :相关公司或个人申请到 Appid 后可以进行真机的调试和预览,否则只能在开发工具里进行调试。 备案域名和证书:微信小程序仅支持 https 协议,所以务必绑定含有证书的域名,才能在正式上线后进行使用。 二…

jumpserver源码包安装

cd /opt wget https://github.com/jumpserver/installer/releases/download/v2.20.1/jumpserver-installer-v2.20.1.tar.gz tar -xf jumpserver-installer-v2.20.1.tar.gz cd jumpserver-installer-v2.20.1 ​ vim config-example.txt 在config-example配置文件里配置mysql&…

nacos 2.2部署指南,并配置mysql数据库

首先进入到/opt cd /opt 1.下载安装包 wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz 2.解压 tar -zxvf nacos-server-2.2.0.tar.gz 3.修改配置 3.1修改为单机部署模式(默认为 vi /opt/nacos/bin/startup.sh 55行,示例: exp…

Cypress 安装及入门排坑指南

最近准备给公司项目做重构&#xff0c;原本是打算使用Jest来作为测试工具的&#xff0c;刚好无意之中接触到了Cypress这款测试工具&#xff0c;虽然用上它非常的不容易&#xff08;简直是一波三折&#xff09;&#xff0c;但是用上了之后觉得真香啊。我们本篇文章就是讲Cypress…

C进阶_C语言_浮点数存储规则_浮点型在内存中的存储

在开始讲解之前&#xff0c;我们看一下常见浮点数的写法&#xff1a; 3.14159 1E10&#xff08;它代表1.0乘以10的10次方&#xff09; 浮点型家族里有float、double、long double类型。 浮点型的表示范围是多少&#xff1f;我们打开float.h就能看到&#xff08;这里用everythi…

什么牌子的蓝牙耳机好?好用的蓝牙耳机排行

现如今&#xff0c;蓝牙耳机的用途越来越广泛&#xff0c;无论是追剧、游戏、通话、运动等&#xff0c;都能看到使用蓝牙耳机的人。在日常的使用中蓝牙耳机也逐渐取代有线耳机成为受人们欢迎的存在&#xff0c;那么&#xff0c;什么牌子的蓝牙耳机好&#xff1f;接下来&#xf…

功能强大的python包sklearn

1. sklearn简介sklearn是基于python语言的机器学习工具包&#xff0c;是目前做机器学习项目当之无愧的第一工具。 sklearn自带了大量的数据集&#xff0c;可供我们练习各种机器学习算法。 sklearn集成了数据预处理、数据特征选择、数据特征降维、分类\回归\聚类模型、模型评估等…

基于YOLO实践布匹缺陷检测

在缺陷检测领域中&#xff0c;越来越多看到AI的身影&#xff0c;路面缺陷、生产缺陷、PCB缺陷、瓶装酒缺陷检测等等&#xff0c;目标检测等模型发挥着越来越多的作用&#xff0c;像瓷砖缺陷和布匹缺陷这类平面类型的缺陷也不例外&#xff0c;最近做的项目中大多和这类型的数据有…