leetcode 2834.找出美丽数组的最小和

这道题作者一开始用的暴力解法,效果还不错,但是对于特别大的数据是过不去的。

先讲一下我暴力的思路:作者用了双指针的解法,我们可以先定义一个数组,就是把数组从1开始考虑,n个连续整数输入到里面去。

然后定义两个指针left和right,一个指向第一个元素,一个指向最后一个元素,然后让这两个数相加。如果nums[left]+nums[right]>target,我们就把right往后移动;如果nums[left]+nums[right]<target,那么就把left往前移(因为我们的初始化数组是有顺序的)。遇到==target的情况,我们需要更换数据:

由于题目中要求我们最小和,我们需要把nums[left]和nums[right]之中比较大的数字更换。那么更换成什么呢?我们知道,数组里面不能出现重复的数字,所以我们只能将这个数字变大,而不能变小,因为变小可能就会引起数组的元素重复了,并且数字变大需要变大到比这个数组的最大元素要大1,这样才能保证最小和。

那么怎么移动呢?这就是语言基础了,我们直接找到需要更改的元素位置,然后将这个元素后面的整体移动覆盖它,再在最后面更换上那个更新后的数字,这样既能保证有序,又能保证最小和(其实这里的思路具有贪心的思想,证明的话不能完全给出)。

这一道题跟某一次leetcode周赛上的题很像,但那个题是可以暴力解出来的,这个题由于数据过大,有10个样例没通过,原因就是时间超出限制。时间复杂度都已经到O(logn)2了,这没办法,思路就到这里了。

class Solution {
public:int minimumPossibleSum(int n, int target) {vector<int>nums(n+1,0);for(int i=0;i<n;i++){nums[i]=i+1;}int left=0;int right=n-1;int st=0;int index=0;while(left<right){if(nums[left]+nums[right]>target)right--;else if(nums[left]+nums[right]<target)left++;else{index=nums[n-1];if(right==n-1)nums[n-1]=index+1;else{st=right;for(int i=st;i<n;i++)nums[i]=nums[i+1];nums[n-1]=index+1;}left=0;right=n-1;}}int sum=0;for(int i=0;i<n;i++){sum=(sum%1000000007+nums[i]%1000000007)%1000000007;}return sum;}
};

至于数学的做法,应该会很好想一点:

以target为基准,我们直接可以判断:1,target-1

2,target-2

...

一直到target/2这里,target/2是直接可以选择的,没必要关乎什么奇数偶数。

前面的那些列举,我们只能选择一个去用,那我们就只选择小的就可以。

这样的话,我们其实已经完成了一部分的答案了,设m=min(target/2,n),显然,在target/2之前的那m个数字我们直接用等差数列的公式计算出来就行了也就是m*(m+1)/2。

至于剩下的那n-m个数,我们知道,刚刚已经从小于等于target的范围里选过了,所以之后需要选择比target大的那一部分了。因此,我们再次使用等差数列的公式就行了:

也就是(n-m)*(target+(target+(n-m)-1)/2,简化一下也就是(n-m)*(2*target+n-m-1)/2。

注意:有些人可能不懂target+(n-m)-1这一部分是啥,因为target后面的部分都是连续的,也就是target+1,target+2...一直加到n-m-1的时候才停止,加上target本身一共n-m个。这个式子就是这样来的。

上代码:

class Solution {
public:int minimumPossibleSum(int n, int target) {long long m=min(target/2,n);return (m*(m+1)+(n-m-1+2*target)*(n-m))/2%1000000007;}
};

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

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

相关文章

工业制氧机的使用与维护管理指南

工业制氧机是工业生产中不可或缺的重要设备&#xff0c;其高效稳定的供氧功能对于保障生产过程的顺利进行至关重要。为了确保工业制氧机能够持续高效地提供氧气&#xff0c;正确的使用方法和维护措施是必不可少的。 在使用工业制氧机时&#xff0c;我们首先要确保设备放置在通风…

网络聊天室的UDP实现以及数据库

网络聊天室UDP实现 服务器端&#xff1a; 头文件&#xff1a; #include <myhead.h>//定义客户信息结构体 typedef struct magtye {char type; //消息类型char name[100]; //客户姓名char text[1024]; //客户发送聊天信息 }msg_t;//定义结构体存储…

mysql的语法总结2

命令&#xff1a; mysql -u 用户名 -p mysql登录 命令&#xff1a;create database u1 创建数据库u1 查询数据库 使用数据库u1 创建表department 查询表department ALTER TABLE 表名 操作类型&#xff1b; 操作类型可以有以下的操作&#xff1a; 添加列&#x…

ZCC3808 低静态电流、可编程延迟监控电路 替代TPS3808

1 特性 • 上电复位发生器具有可调节延迟时间&#xff1a;1.25ms 至10s • 超低静态电流&#xff1a;2.4μA&#xff08;典型值&#xff09; • 高阈值精度&#xff1a;0.5% 典型值 • 提供适用于标准电压轨的 0.9V 至 5V 固定阈值电压且可调节电压低至 0.4V • 手动复位 …

CubeMX使用教程(2)——点亮LED

在上一章&#xff0c;我们完成了CubeMX的环境配置&#xff0c;这一章我们通过CubeMX来完成点亮LED的工作。 通过LED原理图可知&#xff0c;如果我们要点亮LD1&#xff08;第一个灯&#xff09;&#xff0c;它对应开发板的PC8端口&#xff0c;因此我们应该在CubeMX中将PC8配置为…

【并查集】一种简单而强大高效的数据结构

目录 一、并查集原理 二、并查集实现 三、并查集应用 1. LeetCode并查集相关OJ题 2. 并查集的其他应用及总结 一、并查集原理 并查集&#xff08;Disjoint Set&#xff09;是一种用来管理元素分组和查找元素所属组别的数据结构。它主要支持两种操作&#xff1a;查找&…

公司内部的手机拍照管理办法建议

公司内部的手机拍照管理是一项重要的工作&#xff0c;因为它涉及到公司的信息安全、知识产权保护和隐私保护等方面。以下是一些建议的公司内部手机拍照管理办法&#xff1a; 明确拍照目的和范围&#xff1a;首先&#xff0c;公司应明确员工使用手机拍照的目的和范围。例如&…

JavaScript进阶 (1)

封装 构造函数存在问题 js可以通过构造函数进行封装&#xff0c;但存在浪费内存问题 每创建新的对象引用数据类型就开辟新的空间 原型 构造函数通过原型分配函数是所有对象所共享的 每一个构造函数都有一个prototype属性&#xff0c;指向另一个对象&#xff0c;也称为原型…

小型内衣裤洗衣机哪个牌子好?四款高热度内衣洗衣机力荐

相信很多用户从小就有个观念&#xff0c;内衣裤不能跟其他衣物一起混合洗&#xff0c;否则会感染细菌&#xff0c;所以不少人的内衣裤一直都是自己手洗的&#xff0c;清洗内衣裤不算麻烦&#xff0c;但日常都要换洗&#xff0c;对一个白天上班已经很累的人来说&#xff0c;真是…

COM(Component Object Model)通信技术

COM&#xff08;Component Object Model&#xff09;通信技术是一种用于组件之间通信的二进制接口标准&#xff0c;它允许在不同进程或计算机上的组件进行交互。以下是 COM 通信技术的一些基本原理&#xff1a; 1. 二进制接口&#xff08;Binary Interface&#xff09;&#x…

如何 借助 AI + bat,1分钟内建立100个自定义文件和文件夹?

01 你好&#xff0c;我是云桃桃。 最近&#xff0c;我在写web系列的知识&#xff0c;做的过程中遇到过不少问题。今天&#xff0c;就来说说&#xff0c;我解决的一个批量新建文件/文件夹的问题。 事情是这样的。首先&#xff0c;我的大纲基本在幕布里已经弄好了&#xff0c;…

简析内部审计数字化转型的方法和路径【小落送书(第6期)】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

mysqld_exporter安装

1.介绍 主要监控Mysql数据库的稳定性、吞吐量、连接情况、缓冲池使用情况、查询性能等各项指标&#xff0c;是我们压测时常常需要监控的一些指标。2.安装 官方网站下载安装包&#xff0c;区分操作系统3.步骤 &#xff08;1&#xff09;直接解压 &#xff08;2&#xff09;在当…

基于ACM32 MCU的电动滑板车方案介绍

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

玩转AI大模型应用开发,轻松打造热门APPai数字人直播软件!

AI大模型应用在数字人直播领域的应用愈发成熟&#xff0c;为开发者提供了更多创意和可能性。数字人直播软件是当前热门的应用之一&#xff0c;它结合了虚拟主播和人工智能技术&#xff0c;为用户带来全新的互动体验。想要打造一个火爆的数字人直播软件&#xff0c;就需要玩转AI…

从0到1快速搭建一个jeecg 企业级应用管理后台

一. 基本介绍 官网地址&#xff1a;https://jeecg.com/ JeecgBoot 是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的…

vue 使用谷歌地图 @googlemaps/js-api-loader 进行模糊搜索

<template><div class"map"><div class"mapLeftStyle"><el-inputv-model"input"placeholder"请输入内容"class"controls"input"chnageinput"><i slot"prefix" class"e…

JavaWeb-MyBatis(上)

学完项目管理工具Maven后&#xff0c;继续学习MyBatis。我们都知道&#xff0c;JDBC是一个与数据库连接相关的API&#xff0c;最开始学习数据库连接都是从JDBC开始学起&#xff0c;但是其也有缺点&#xff0c;比如硬编码和操作繁琐等等。而今天学习的MyBatis就是专门为简化JDBC…

【Node.js从基础到高级运用】三、JavaScript基础

Node.js入门&#xff1a;JavaScript基础 在成功搭建了Node.js的开发环境之后&#xff0c;我们即将进入Node.js编程的核心——JavaScript语言本身。在这篇文章中&#xff0c;我们将回顾JavaScript的基础知识&#xff0c;这些是每个Node.js开发者都必须掌握的概念。我们还将探讨…

强制Unity崩溃的两个方法

在Unity中&#xff0c;这两种方法都可以用于强制使应用程序崩溃&#xff0c;但它们的作用略有不同&#xff1a; Application.ForceCrash(0); 这个方法会强制应用程序崩溃&#xff0c;并且参数传入的是一个整数值。当参数为0时&#xff0c;它会导致应用程序崩溃并显示一个“Acce…