【问题描述】[中等]

给你一个整数数组 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-/

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

  1. 365天挑战LeetCode1000题——Day 038 公交站间的距离 + 基于时间的键值存储 + 转变数组后最接近目标值的数组和 + 有界数组中指定下标处的最大值

    文章目录 1184. 公交站间的距离 代码实现(自解) 981. 基于时间的键值存储 代码实现(自解) 1300. 转变数组后最接近目标值的数组和 代码实现(自解) 1802. 有界数组中指定下标处的 ...

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

    1. 题目 给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value , 使得将数组中所有大于 value 的值变成 value 后,数组的和 最接近 target (最接 ...

  3. leetcode1300. 转变数组后最接近目标值的数组和

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

  4. 从一个数组中找出最接近目标_LeetCode每日一题 | 转变数组后最接近目标值的数组和...

    题目来源:LC1300 这道题目是一道比较经典的二分查找题. 我们注意到,当value越大时,数组之和越大,当value越小时,数组之和越小.因此,我们可以利用数组之和是value的单调递增函数这个性 ...

  5. [Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]

    [问题描述][第560题][和为K的子数组][中等] 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数.示例 1 :输入:nums = [1,1,1], k = 2 输 ...

  6. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  7. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  8. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  9. [Leedcode][JAVA][第16题][最接近的三数之和][双指针][数组]

    [问题描述][中等] 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯 ...

最新文章

  1. oracle并行parallel update两张表_Oracle并行更新的两种方式(merge/update内联视图)
  2. Microbiome:中外合作揭示微生物群落降解复杂微生物聚合物的酶(视频导读)
  3. php分页功能乱码了怎么办,51、PHP文件内容分页操作,避免乱码
  4. [导入]C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式.zip(8.75 MB)...
  5. bzoj1670【Usaco2006 Oct】Building the Moat 护城河的挖掘
  6. CompletableFuture详解~thenApply
  7. Domino下实现仿Google搜索提示效果
  8. 为什么微软要把数据中心设在水下?
  9. Matlab中vpa一直在忙,matlab数据类型转换遇到问题,及解决办法,sym,double ,vpa转换...
  10. CentOS下通过yum安装svn及配置
  11. tensorflow 数据归一化_TensorFlow——批量归一化操作
  12. Protel DXP 2004 SP3_SP4 注册机
  13. 基于JavaWEB+MySQL的房屋租赁网站管理系统
  14. Java中的Date时间转换【SimpleDateFormat (parse和format)】和Calendar日历表
  15. Git - git 入门
  16. 【干货】PCB线宽与电流关系
  17. 智能环境监控系统解决方案及应用背景
  18. 关于多极充磁磁环表面磁场分布的研发历程GM900系列表磁分布测量仪
  19. 立可得_第1章_物联网亿万级通信一站式解决方案EMQ
  20. python调用包的路径_Python3 模块、包调用路径详解

热门文章

  1. 回溯法 -数据结构与算法
  2. 字符串转16进制字节数组,字节数组转16进制字符串
  3. java web 多语言_基于 Selenium WebDriver 实现多语言环境下自动化截图
  4. java反射 pdf_java反射学习笔记整理.pdf
  5. 后台返回数据打印是[object object]的,报错:SyntaxError: JSON.parse: expected property name or ‘}‘ at line 1 column
  6. Netty入门篇-从双向通信开始
  7. Android kotlin基础语法
  8. Android 贴纸样式标签
  9. android 重叠view 重叠布局,按比例布局
  10. Cass2008 for CAD2006 安装