[Leedcode][JAVA][第1300题][转变数组后最接近目标值的数组和][前缀和][二分法][暴力]

【问题描述】[中等]

给你一个整数数组 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. 暴力法

在这里插入图片描述
时间复杂度:O(N^2) 空间复杂度:O(1)

class Solution {public int findBestValue(int[] arr, int target) {int min = Integer.MAX_VALUE;int num = target/arr.length, minIndex = num;for (int i = num; i < target; i++) {int sum = 0;for (int j = 0; j < arr.length; j++) {if (arr[j] > i)   sum += i;else    sum += arr[j];}if (Math.abs(target-sum) < min) {min = Math.abs(target-sum);minIndex = i;} else  break;}return minIndex;}
}
2. 二分法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

时间复杂度:O(NlogN) 空间复杂度:O(1)

public class Solution {public int findBestValue(int[] arr, int target) {int left = 0;int right = 0;// 注意:for (int num : arr) {right = Math.max(right, num);}while (left < right) {int mid = left + (right - left) / 2;int sum = calculateSum(arr, mid);// 计算第 1 个使得转变后数组的和大于等于 target 的阈值 thresholdif (sum < target) {// 严格小于的一定不是解left = mid + 1;} else {right = mid;}}// 比较阈值线分别定在 left - 1 和 left 的时候与 target 的接近程度int sum1 = calculateSum(arr, left - 1);int sum2 = calculateSum(arr, left);if (target - sum1 <= sum2 - target) {return left - 1;}return left;}private int calculateSum(int[] arr, int threshold) {int sum = 0;for (int num : arr) {sum += Math.min(num, threshold);}return sum;}public static void main(String[] args) {int[] arr = new int[]{2, 3, 5};int target = 11;Solution solution = new Solution();int res = solution.findBestValue(arr, target);System.out.println(res);}
}

在这里插入图片描述
时间复杂度:O(NlogN) 空间复杂度:O(1)

public class Solution {public int findBestValue(int[] arr, int target) {int left = 0;int right = 0;// 注意:for (int num : arr) {right = Math.max(right, num);}while (left < right) {int mid = left + (right - left + 1) / 2;int sum = calculateSum(arr, mid);// 计算最后 1 个使得转变以后数组的和小于等于 target 的阈值 thresholdif (sum > target) {// 大于等于的就不是解,threshold 太大了,下一轮搜索区间是 [left, mid - 1]right = mid - 1;} else {// 下一轮搜索区间是 [mid, right]left = mid;}}// 比较阈值线分别定在 left 和 left + 1 的时候与 target 的接近程度int sum1 = calculateSum(arr, left);int sum2 = calculateSum(arr, left + 1);// 注意:这里必须加绝对值,因为有可能出现 sum1 == sum2 < target 的情况if (Math.abs(target - sum1) <= Math.abs(sum2 - target)) {return left;}return left + 1;}private int calculateSum(int[] arr, int threshold) {int sum = 0;for (int num : arr) {sum += Math.min(num, threshold);}return sum;}public static void main(String[] args) {int[] arr = new int[]{2, 3, 5};int target = 11;Solution solution = new Solution();int res = solution.findBestValue(arr, target);System.out.println(res);}
}

【总结】

1.巧妙计算前缀和
int[] prefix = new int[n + 1];for (int i = 1; i <= n; ++i) {prefix[i] = prefix[i - 1] + arr[i - 1];}
2. binarySearch(Object[], Object key)

在这里插入图片描述

3.排除法二分总结

参考链接https://blog.csdn.net/dadongwudi/article/details/105345157

转载链接:https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target/solution/er-fen-cha-zhao-by-liweiwei1419-2/

参考链接:https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target/solution/fen-duan-zhi-hou-bao-li-cha-zhao-guan-fang-shu-ju-/

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

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

相关文章

线性系统的基本理论与运算

线性系统的基本理论与运算 线性系统与非线性系统 线性系统的基本理论 二维线性移不变系统 线性移不变系统 如果一个系统既是线性系统&#xff0c;又是移不变系统&#xff0c;则该系 统是线性移不变系统。

行云管家堡垒机 导入腾讯云主机

行云管家堡垒机 导入腾讯云主机 如何实现了对多家云厂商多种云计算资源的集中管理&#xff0c;从成本、监控、备份、安全等多个维度提供统一运维管控&#xff1f; 工具/原料 行云管家堡垒机方法/步骤 Step1&#xff1a;注册登录 登录行云管家&#xff0c;支持QQ、微信、微博、G…

HDU - 5438 Ponds 拓扑 dfs

题意 在一个图中 给出了每个点得权值和连边 想要尽可能删除一些联通的点数小于2的点 删完后 求最后剩下联通块内点得数量是奇数的权值和 分析 本题由于在删除点得过程中需要考虑 当把当前点删除后 其联通的点也有可能会因为当前点得删除而连边小于2同时删除 考虑拓扑排序 建…

(总结)HTTP常见错误返回代码

&#xff08;总结&#xff09;HTTP常见错误返回代码 HTTP返回状态代码 当用户试图通过HTTP或FTP协议访问一台运行主机上的内容时&#xff0c;Web服务器返回一个表示该请求的状态的数字代码。该状态代码记录在服务器日志中&#xff0c;同时也可能在 Web 浏览器或 FTP客户端显示…

MyBatis面试题(2020最新版)

目录MyBatis简介MyBatis是什么&#xff1f;ORM是什么为什么说Mybatis是半自动ORM映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;传统JDBC开发存在的问题JDBC编程有哪些不足之处&#xff0c;MyBatis是如何解决这些问题的&#xff1f;Mybatis优缺点MyBatis框架适用场景…

Java学习笔记9-2——JavaWeb

文章目录JavaBeanMVC三层架构Filter过滤器Listener监听器JDBC文件上传Servlet邮件发送ServletJavaBean 实体类 JavaBean有特定的写法&#xff1a; 必须要有一个无参构造&#xff1b;属性必须私有化&#xff1b;必须有对应的get/set方法&#xff1b; 一般用来和数据库的字段…

linux日常常用命令分析

日志处理&#xff1a;测试网络路由&#xff1a; xargs使用方法&#xff1a;tcpdump命令分析&#xff1a;dd 写入磁盘测试cpu个数&#xff1a;查看网卡流量查看端口联通情况,临时加端口ntpdate同步&#xff1a;可以取出变动的密码&#xff1a;导堆栈&#xff1a;根据进程id查看程…

离散傅立叶变换

离散傅立叶变换 一维离散傅里叶变换 二维离散傅里叶变换(2D-DFT) 、图像傅里叶变换的意义 &#xff08;1&#xff09;简化计算&#xff0c;也即傅里叶变换可将空间域中复杂的卷 积运算转化为频率域中简单的乘积运算。 &#xff08;2&#xff09;对于某些在空间域中难于处理或…

[Leedcode][JAVA][第14题][最长公共前缀][二分][横竖扫描][分治]

【问题描述】[中等] 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。示例 1:输入: ["flower","flow","flight"] 输出: "fl" 示例 2:输入: ["dog","raceca…

【模板】在build中配置resources来防止我们资源导出失败的问题

在build中配置resources&#xff0c;来防止我们资源导出失败的问题 <!--在build中配置resources&#xff0c;来防止我们资源导出失败的问题--><build><resources><resource><directory>src/main/resources</directory><includes><…

JDBC_设计架构_驱动类加载_建立Connection_效率测试

JDBC(Java DataBase Connection) 访问数据库流程&#xff1a;驱动管理器--连接数据库--sql语句--结果集 装载mysql驱动 Class.forName("com.jdbc.mysql.Driver"); DriverManager接口是JDBC的管理器&#xff0c;作用于用户和驱动程序之间。 Demo1.java package com.qh…

HDU-4793 Collision 计算几何 解方程

题意 给我们两个大小不同的圆的半径小圆是实心的 大圆是空心的 然后给我们一个小球的半径 小球的初始位置 还有飞碟在x方向和y方向上的速度 小球撞到内实心圆会能量不损失的反弹 问小球任何位置与大圆相交到完全出去的时间是多少 分析 几何题 如何知道时间呢 如果小球与大圆…

图像傅里叶变换频谱分析

图像的傅里叶频谱特性分析 图像傅里叶频谱关于(/&#xff0c;/)的对称性 图像傅里叶频谱特性及其频谱图 傅里叶变换在图像处理中的应用

[剑指offer]面试题第[37]题[Leedcode][JAVA][第297题][二叉树列的序列化与反序列化][递归][BFS]

【问题描述】[中等] 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列…

Java学习笔记10-1——MyBatis

文章目录简介第一个Mybatis程序搭建环境导入Mybatis&#xff0c;编写配置文件编写代码测试了解一下官方文档的建议实现增删改查select、insert、update、delete使用map进行CRUD模糊查询配置解析(mybatis-config.xml)核心配置文件mybatis-config.xml环境配置&#xff08;environ…

时间

//Step1: 定义任务函数: 计算当前时间距离target时间的时间差var targetnew Date("2019/3/01 18:00:00");function calc(){//获得当前系统时间保存在变量now中var nownew Date();//用target-now&#xff0c;再除1000&#xff0c;获得秒差&#xff0c;保存在变量s中va…

图像的离散余弦变换

Discrete Cosine Transform&#xff0c;简写为DCT 函数的偶对称性使DCT只有实数域变换结果, 不再涉及复数运算&#xff0c;运算简单&#xff0c;费时少&#xff1b; 又保持了变换域的频率特性&#xff1b; 与人类视觉系统特性相适应&#xff1b; 得到了更加广泛的应用。 二维…

【匈牙利算法】【二分图匹配】【转载】趣写算法系列之--匈牙利算法

转载自&#xff1a;http://blog.csdn.net/dark_scope/article/details/8880547 【书本上的算法往往讲得非常复杂&#xff0c;我和我的朋友计划用一些简单通俗的例子来描述算法的流程】 匈牙利算法是由匈牙利数学家Edmonds于1965年提出&#xff0c;因而得名。匈牙利算法是基于H…

Rest Framework

目录导航 一、RESTful 规范 二、APIView 组件 三、序列化组件 四、认证组件 五、权限组件 六、频率组件 七、分页器组件 一、RESTful 规范 什么是RESTful规范&#xff1a; REST与技术无关&#xff0c;代表的是一种软件架构风格&#xff0c;REST是Representational State Transf…

[剑指offer][JAVA]面试题第[26]题[树的子结构][递归]

【问题描述】[中等] 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。例如: 给定的树 A:3/ \4 5/ \1 2 给定的树 B&#xff1a;4 /1 返回 true&#xff0c;因为 B 与…