LeetCode 1300. 转变数组后最接近目标值的数组和(二分查找)

1. 题目

给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,
使得将数组中所有大于 value 的值变成 value 后,数组的和 最接近 target (最接近表示两者之差的绝对值最小)。

如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值

请注意,答案不一定是 arr 中的数字。

示例 1:
输入:arr = [4,9,3], target = 10
输出:3
解释:当选择 value 为 3 时,数组会变成 [3, 3, 3],和为 9 ,
这是最接近 target 的方案。示例 2:
输入:arr = [2,3,5], target = 10
输出:5示例 3:
输入:arr = [60864,25176,27249,21296,20204], target = 56803
输出:11361提示:
1 <= arr.length <= 10^4
1 <= arr[i], target <= 10^5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 先将数组排序,求出前缀和
  • 要找的这个数ans上下限 [0, arr_max]
  • 如果这个数ans比0还小,数组所有的数将变成ans,target > 0,不会更接近
  • 如果这个数ans比数组最大的还大,数组所有的数不变,跟target的差,也不变,但题目要求最小的ans,所以ans的范围是 [0, arr_max]
  • 现在需要证明,数组的和与target的单调性:
    假设选取的数为 v2, a[i-1] <= v2 < a[i]
    此时,a[0]+a[1]+...+a[i−1]+v2+...+v2(n−i个)−target−式1a[0]+a[1]+...+a[i-1]+ v2+...+v2 (n-i个)-target-式1a[0]+a[1]+...+a[i1]+v2+...+v2(ni)target1
    再次选择数 v1,a[i-1] <= v1 < v2
    此时,a[0]+a[1]+...+a[i−1]+v1+...+v1(n−i个)−target−式2a[0]+a[1]+...+a[i-1]+ v1+...+v1 (n-i个)-target - 式2a[0]+a[1]+...+a[i1]+v1+...+v1(ni)target2
    上下做差:式1-式2 = (v2−v1)∗(n−i)>=0(v2-v1)*(n-i) >= 0(v2v1)(ni)>=0
    选择数 v1,v1 < a[i-1] < v2
    此时,a[0]+a[1]+...+a[i−2]+v1+...+v1(n−i+1个)−target−式3a[0]+a[1]+...+a[i-2]+ v1+...+v1 (n-i+1个)-target - 式3a[0]+a[1]+...+a[i2]+v1+...+v1(ni+1)target3
    上下做差:式1-式3 = a[i−1]−v1+(v2−v1)∗(n−i)>=0a[i-1]-v1+(v2-v1)*(n-i) >= 0a[i1]v1+(v2v1)(ni)>=0
    所以上式是单调递增的!可以进行二分查找
class Solution {
public:int findBestValue(vector<int>& arr, int target) {int i, l, r, mid, idx, diff, mindiff = INT_MAX, n = arr.size(), ans=INT_MAX;sort(arr.begin(),arr.end());vector<int> presum(arr);for(i = 1; i < n; ++i)presum[i] += presum[i-1];//前缀和l = 0, r = arr[n-1];//范围while(l <= r){mid = l+((r-l)>>1);idx = binsearch(arr, mid);//二分查找mid这个值在数组中的位置diff = (idx>0? presum[idx-1] : 0) +(n-idx)*mid-target;//函数式的值,函数单调递增if(abs(diff) < mindiff){mindiff = abs(diff);ans = mid;//有更小的}else if((abs(diff) == mindiff))ans = min(ans,mid);//相等的情况下取更小的if(diff < 0)//小了,要让他增大,在0左右寻找l = mid+1;else if(diff > 0)r = mid-1;elsereturn ans;}return ans;}int binsearch(vector<int>& arr, int val){	//找第一个大于val的数的下标int l = 0, r = arr.size()-1, mid;while(l <= r){mid = l+((r-l)>>1);if(arr[mid] > val){if(mid==0 || arr[mid-1] <= val)return mid;elser = mid-1;}elsel = mid+1;}return arr.size();//没找到,全部小于val}
};

在这里插入图片描述

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

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

相关文章

AJAX 弹出窗消息类

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO;using System.Text;using System.Web.UI;namespace WebApplication{ /// <summary> /// 消息类 /// /// /// </summary> public class Me…

mysql 创建初始化帐号_MySQL创建SCOTT用户及初始化数据

表结构create table dept(-- 部门编号deptno int unsigned auto_increment primary key,-- 部门名称dname varchar(15) ,-- 部门所在位置loc varchar(50))engine InnoDB;create table emp(-- 雇员编号empno int unsigned auto_increment primary key,-- 雇员姓名ename varchar…

潜在语义分析(Latent Semantic Analysis,LSA)

文章目录1. 单词向量空间、话题向量空间1.1 单词向量空间1.2 话题向量空间2. 潜在语义分析算法2.1 例子3. 非负矩阵分解算法4. TruncatedSVD 潜在语义分析实践一种无监督学习方法&#xff0c;主要用于文本的话题分析其特点是通过矩阵分解发现文本与单词之间的基于话题的语义关系…

python分割提取字符串_Python 字符串操作(截取/替换/查找/分割)

python字符串连接先介绍下效率比较低的&#xff0c;有些新手朋友就会犯这个错误&#xff1a;a [a,b,c,d]content for i in a:content content iprint content说下为什么效率会低呢&#xff1f;原因&#xff1a;在循环连接字符串的时候&#xff0c;他每次连接一次&#xff0…

CURL详解[全]

PHP中的CURL函数库&#xff08;Client URL Library Function&#xff09;curl_close — 关闭一个curl会话curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数curl_errno — 返回一个包含当前会话错误信息的数字编号curl_error — 返回一个包含当前会话错误信息的字符串…

基于sklearn.decomposition.TruncatedSVD的潜在语义分析实践

文章目录1. sklearn.decomposition.TruncatedSVD2. sklearn.feature_extraction.text.TfidfVectorizer3. 代码实践4. 参考文献《统计学习方法》潜在语义分析&#xff08;Latent Semantic Analysis&#xff0c;LSA&#xff09; 笔记 1. sklearn.decomposition.TruncatedSVD sk…

一个简单又高效的日志系统

摘要&#xff1a;本文给出一个性能高&#xff0c;使用简单的日志解决方案。本模块实现日志信息的批量写入文件&#xff0c;定时自动flush到文件中&#xff0c;写入文件的日志级别可动态调整&#xff0c;单个日志文件大小可配置&#xff0c;循环对日志文件写入&#xff0c;这样不…

R语言chorolayer_R语言空间可视化:绘制英国脱欧投票地图

添加法国&#xff0c;它位于右下方&#xff0c;因此我们应该看到一点…plot(FR,addTRUE)然后&#xff0c;我们可以检索英国退欧公投数据referendumddply(referendum,.(Region,HASC_code),summarise,Remainsum(Remain),Leavesum(Leave))我们可以发现&#xff0c;脱欧赢得了51.89…

概率潜在语义分析(Probabilistic Latent Semantic Analysis,PLSA)

文章目录1. 概率潜在语义分析模型1.1 基本想法1.2 生成模型1.3 共现模型1.4 模型性质2. 概率潜在语义分析的算法概率潜在语义分析&#xff08;probabilistic latent semantic analysis&#xff0c;PLSA&#xff09;&#xff0c;也称概率潜在语义索引&#xff08;probabilistic …

网站变成灰色调

为方便站点哀悼&#xff0c;特提供css滤镜代码&#xff0c;以表哀悼。以下为全站CSS代码。html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale1); } 使用方法&#xff1a;这段代码可以变网页为黑白&#xff0c;将代码加到CSS最顶端就可以实现素装。建议全国…

马尔可夫链蒙特卡罗法(Markov Chain Monte Carlo,MCMC)

文章目录1. 蒙特卡罗法2. 马尔可夫链3. 马尔可夫链蒙特卡罗法4. Metropolis-Hastings 算法5. 吉布斯抽样蒙特卡罗法&#xff08;Monte Carlo method&#xff09;&#xff0c;也称为统计模拟方法&#xff08;statistical simulation method&#xff09;&#xff0c;是通过从概率…

NHibernate 异常及解决办法(长期添加中)

Mapping 错误&#xff1a; 1&#xff09; Could not determine type for:Namespance.Class,AssemblyName, for columns: NHibernate.Mapping.Column(ColumnName) 通常是Mapping中的 type attribute设定错误&#xff0c;在Assembly找不到。如 <property name"PropertyNa…

mysql scope runtime_maven scope provided和runtime的例子

maven常用的scope有compile,provided,runtime,test。complie是默认值&#xff0c;表示在build,test,runtime阶段的classpath下都有依赖关系。test表示只在test阶段有依赖关系&#xff0c;例如junitprovided表示在build,test阶段都有依赖&#xff0c;在runtime时并不输出依赖关系…

[网站seo优化] 史上最全增加外链的方法!

目前在国内网站在百度的权重尤为重要 百度的权重主要取决于 1&#xff0c;收录量2&#xff0c;外链数与质量3&#xff0c;建站时间 可见外链的重要性现在就分享一篇关于外链的文章&#xff0c;希望对大家有用。 一、网站内容1. 写一篇权威的文章(毫无疑问是获得链接的最好方法…

python自动化安装软件_python自动化安装源码软件包

#!/usr/bin/env python# -*- coding:utf:8 -*-#create by 、矿泉水 2015/7/30import sys,commandsif len(sys.argv) 2:SOFTWARE sys.argv[1]commands.getstatusoutput(‘tar zxvf %s &> install.log 2>&1‘%SOFTWARE)SOFTWARE SOFTWARE.split(‘.‘)SOFTWARE.…

蒙特卡罗法近似求解圆周率π

文章目录1. 原理2. 模拟代码1. 原理 给出 x∈[0,1),y∈[0,1)x \in [0,1),y\in[0,1)x∈[0,1),y∈[0,1) 的均匀分布随机点&#xff0c;模拟 ttt 次&#xff0c;落在以 (0,0)(0,0)(0,0) 为圆心&#xff0c;半径 r1r1r1 的圆以内的次数为 ccc当模拟次数足够大时&#xff0c;可以看成…

算法导论2.3-7

Q: 请给出一个运行时间为θ(nlgn)的算法&#xff0c;使之能在一个由n个整数构成的集合S和另一个整数X时&#xff0c;判断出S中是否存在有两个其和等于X的元素。A: 先对S[1 TO N]进行合并排序--------------------------------θ(nlgn) FOR a <- [1 TO N-1]-----------------…

LeetCode 1318. 或运算的最小翻转次数(位运算)

1. 题目 给你三个正整数 a、b 和 c。 你可以对 a 和 b 的二进制表示进行位翻转操作&#xff0c;返回能够使按位或运算 a OR b c 成立的最小翻转次数。 「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。 示例 1&#xff1a; 输入&#x…

redis和mysql数据不一致_高并发下为什么 redis 和数据库不一致?怎么解决?

现在的web架构一般都用redis作为缓存层来减轻数据库的压力&#xff0c;数据在此架构下的读取问题&#xff0c;一般都是先判断redis缓存是否有数据&#xff0c;如果有&#xff0c;直接返回&#xff0c;否则读取数据库的数据&#xff0c;写入redis&#xff0c;返回数据&#xff0…

LeetCode 91. 解码方法(动态规划)

1. 题目 一条包含字母 A-Z 的消息通过以下方式进行了编码&#xff1a; A -> 1 B -> 2 ... Z -> 26给定一个只包含数字的非空字符串&#xff0c;请计算解码方法的总数。 示例 1: 输入: "12" 输出: 2 解释: 它可以解码为 "AB"&#xff08;1 2&am…