随笔 - 1133  文章 - 0 评论 - 19 阅读 - 20万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

复制代码
 1 class Solution:
 2     def findBestValue(self, arr: 'List[int]', target: int) -> int:
 3         l, r = 0, 10**5
 4         diff = abs(sum(arr) - target)
 5         res = collections.defaultdict(list)
 6         while l < r:
 7             m = (l + r) // 2
 8             s = sum([m if n > m else n for n in arr])
 9             if abs(s - target) <= diff:
10                 diff = abs(s - target)
11                 res[diff] += [m]
12             if s < target:
13                 l = m + 1
14             else: 
15                 r = m
16         return min(res[diff])
复制代码

参考:https://leetcode.com/problems/sum-of-mutated-array-closest-to-target/discuss/464211/Python-Binary-Search

 

补充另一个,使用Java实现的代码,可读性好一些:

复制代码
 1 class Solution {
 2     public int findBestValue(int[] arr, int target) {
 3         int left = 1;
 4         int right = target;
 5         
 6         int diff = 0;
 7         while (left < right) {
 8             int mid = left + (right - left) / 2;
 9             int sum = calSum(arr, mid);
10             diff = sum - target;
11             if (diff == 0) {
12                 return mid;
13             } else if (diff < 0) {
14                 left = mid + 1;
15             } else if (diff > 0) {
16                 right = mid;
17             }
18         }
19         
20         diff = calSum(arr, left) - target;
21         int prevDiff = calSum(arr, left - 1) - target;
22         
23         // System.out.println("now left " + left + " diff " + diff);
24         // System.out.println("Math.abs(prevDiff)" + Math.abs(prevDiff) + 
25         //                    " Math.abs(diff)" + Math.abs(diff));
26         
27         return Math.abs(prevDiff) <= Math.abs(diff) ? left - 1 : left;
28     }
29     
30     int calSum(int[] arr, int val) {
31         int sum = 0;
32         for (int i = 0; i < arr.length; i++) {
33             if (arr[i] > val) {
34                 sum += val;
35             } else {
36                 sum += arr[i];
37             }
38         }
39         
40         return sum;
41     }
42 }
复制代码

参考:https://leetcode.com/problems/sum-of-mutated-array-closest-to-target/discuss/464132/Java-3ms-binary-search-clean-readable-code

算法思路:二分查找。

posted on   Sempron2800+  阅读(221)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
点击右上角即可分享
微信分享提示