(9)1300. 转变数组后最接近目标值的数组和
2020-07-16 04:32
85 查看
题目链接:https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target/ 困难度:中 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 <= arr.length <= 10^4 1 <= arr[i], target <= 10^5
还是不会做 ,和之前做过的编程题相比 难!。。。 也就简单的还有可能做出来。。。哎。 看了看思路 大概理解了
class Solution { public: int findBestValue(vector<int>& arr, int target) { // 对vector进行排序 sort(arr.begin(), arr.end()); // 获取长度 int n = arr.size(); //拿到数组中最大值 int max = arr[n - 1]; // 用来保存对应的前缀 pre[0]=0 pre =数组之和 // 典型的空间换时间 vector<int> pre(n + 1); for (int i = 1; i <= n; i++) { pre[i] = pre[i - 1] + arr[i - 1]; } //ans 记录返回的数 int ans = 0; //dif 相差的值 int dif = target; //循环范围为 1-max //为0的话 该数组和为0 //大于max失去意义 数组内的数字不会在变化 for (int i = 1; i <= max; ++i) { //lower_boundlower_bound( begin,end,num) //从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字 //找到返回该数字的地址,不存在则返回end。 //f返回的it-arr.begin() 即为数组下标 // 还有一个函数叫upper_bound 返回第一个大于的数 //这两个函数 使用方法为 二分查找 auto it = lower_bound(arr.begin(), arr.end(), i); int j = it - arr.begin(); //sum 为当数为i时的 和 int sum = pre[j] + (n - j) * i; if (abs(sum - target) < dif) { ans = i; dif = abs(sum - target); } } return ans; } };
还有一种
class Solution { public: int findBestValue(vector<int>& arr, int target) { sort(arr.begin(), arr.end()); int n = arr.size(); int max = arr[n - 1]; vector<int> pre(n + 1); for (int i = 1; i <= n; i++) { pre[i] = pre[i - 1] + arr[i - 1]; } int l = 0; int ans = -1; int cur = 0; while (l <= max) { int mid = (l + max) / 2; auto iter = lower_bound(arr.begin(), arr.end(), mid); cur = pre[iter - arr.begin()] + (arr.end() - iter) * mid; if (cur <= target) { ans = mid; l = mid + 1; } else { max = mid - 1; } } auto it1 = lower_bound(arr.begin(), arr.end(), ans); int small = pre[it1 - arr.begin()] + (arr.end() - it1) * (ans); auto it = lower_bound(arr.begin(), arr.end(), ans+1); int big = pre[it - arr.begin()] + (arr.end() - it) * (ans+1); return abs(small - target) <= abs(big - target) ? ans : ans + 1; } };
相关文章推荐
- 从一个数组中查找和目标数最接近的或者相等的数
- 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
- 求无序数组中三个元素相加与目标数最接近的三元素之和
- java折半查找法 查找数组中与目标数最接近的数
- 346/5000 给定一个n个整数的数组S,在S中找到三个整数,使得总和最接近给定数量的目标。 返回三个整数的和。
- lintcode (找到出现频率最高,将一个链表转换为一个数组, 查找斐波纳契数列中第 N 个数,链表的中点(不遍历),string转int,升序数组,目标最后位置,尾部的零
- 编程之美--将数组分割成两个和最接近的数组(数组长度不限)
- java常用算法之返回目标数字在有序数组中的位置(假设有序数组中不存在重复数字)
- 【LeetCode】TwoSum - 求数组中两个数之和等于指定目标的加数下标
- JS中的数组转变成JSON格式字符串的方法
- 双核问题-子数组和最接近数组总和一半
- 数组和集合之间的转变
- 2020.3.25——String.valueOf():char数组转变成字符串
- 将数组转变为字符串 join()方法
- 16.计算最接近目标值的和
- python算法:嵌套数组转变成一维数组
- 目标:完成数组和链表创建队列,完成其余基本数据结构。
- leetcode-java.T016_threeSumClosest---给定包含n个整数数组S,找到S中的三个整数,从而使之和最接近给定的数,返回三个整数的总和.
- 【LeetCode】1389. 按既定顺序创建目标数组
- 编写一个函数,它从一个字符串中提取一个子字符串。函数原型如下: Int substr(char dst[], char src[],int start, int len) {} 目标是:从src数组