Leetcode 1818.绝对差值和

  • 题目描述
  • 解题思路

题目描述

给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n 。数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。

你可以选用 nums1 中的 任意一个 元素来替换 nums1 中的 至多 一个元素,以 最小化 绝对差值和。在替换数组 nums1 中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 109 + 7 取余 后返回。

|x| 定义为:

  • 如果 x >= 0 ,值为 x ,或者
  • 如果 x <= 0 ,值为 -x

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-absolute-sum-difference

示例1:

输入:nums1 = [1,7,5], nums2 = [2,3,5]
输出:3
解释:有两种可能的最优方案:
- 将第二个元素替换为第一个元素:[1,7,5] => [1,1,5] ,或者
- 将第二个元素替换为第三个元素:[1,7,5] => [1,5,5]
两种方案的绝对差值和都是 |1-2| + (|1-3| 或者 |5-3|) + |5-5| = 3

示例2:

输入:nums1 = [2,4,6,8,10], nums2 = [2,4,6,8,10]
输出:0
解释:nums1 和 nums2 相等,所以不用替换元素。绝对差值和为 0

示例3:

输入:nums1 = [1,10,4,4,2,7], nums2 = [9,3,5,1,7,4]
输出:20
解释:将第一个元素替换为第二个元素:[1,10,4,4,2,7] => [10,10,4,4,2,7]
绝对差值和为 |10-9| + |10-3| + |4-5| + |4-1| + |2-7| + |7-4| = 20

提示:

  • n==nums1.lengthn == nums1.lengthn==nums1.length
  • n==nums2.lengthn == nums2.lengthn==nums2.length
  • 1<=n<=1051 <= n <= 10^51<=n<=105
  • 1<=nums1[i],nums2[i]<=1051 <= nums1[i], nums2[i] <= 10^51<=nums1[i],nums2[i]<=105

解题思路

首先看一个不能完全通过的代码:

class Solution {public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {int n = nums1.length;int maxDiff = 0, p = 0, res = 0;for (int i = 0; i < n; i++) {int temp = Math.abs(nums1[i] - nums2[i]);if (temp > maxDiff) {maxDiff = temp;p = i;}res += temp;}if (maxDiff != 0) {int diff = 0;for (int j : nums1) {int temp = Math.abs(j - nums2[p]);if (temp < maxDiff) {diff = Math.max(diff, temp);}}res -= diff;}return res;}
}

当输入:

57,42,21,28,30,25,22,12,55,3,47,18,43,29,20,44,59,9,43,7,8,5,42,53,99,34,37,88,87,62,38,68,31,3,11,61,93,34,63,27,20,48,38,5,71,100,88,54,52,15,98,59,74,26,81,38,11,44,25,69,79,81,51,85,59,84,83,99,31,47,31,23,83,70,82,79,86,31,50,17,11,100,55,15,98,11,90,16,46,89,34,33,57,53,82,34,25,70,5,1
76,3,5,29,18,53,55,79,30,33,87,3,56,93,40,80,9,91,71,38,35,78,32,58,77,41,63,5,21,67,21,84,52,80,65,38,62,99,80,13,59,94,21,61,43,82,29,97,31,24,95,52,90,92,37,26,65,89,90,32,27,3,42,47,93,25,14,5,39,85,89,7,74,38,12,46,40,25,51,2,19,8,21,62,58,29,32,77,62,9,74,98,10,55,25,62,48,48,24,21

预期返回值为3441, 实际返回值为3442。出现这种情况可能的原因是因为数组中存在多对组合,它们的差值的绝对值相等且最大。如何修改代码暂未考虑清楚。

下面,我们学习使用二分查找的方法解决该问题。在进行处理前,先对 nums1 进行拷贝并排序,得到 sorted 数组。然后 在遍历 nums1 和 nums2 计算总的差值 sum 时,通过对 sorted 进行二分查找,找到最合适替换 nums[i] 的值。具体地:

当我们处理到第 i 位时,假设该位的原差值为 diff=abs(nums1[i]−nums2[i])diff = abs(nums1[i] - nums2[i])diff=abs(nums1[i]−nums2[i]),然后从 sorted 数组中通过二分找到最接近 nums2[i] 的值,计算一个新的差值 newDiff(注意要检查分割点与分割点的下一位),如果满足newDiff<diff 说明存在一个替换方案使得差值变小,我们使用变量 maxDiff 记下来这个替换方案所带来的变化,并不断更新 maxDiff。

当整个数组被处理完,maxDiff 存储着最优方案对应的差值变化,此时 sum−maxDiffsum - maxDiffsum−maxDiff 即是答案。
代码如下:

package com.jz.day1122;import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;/*** Leetcode1818. 绝对差值和*/
public class MinAbsoluteSumDiff {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNextLine()) {int[] nums1 = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int[] nums2 = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int res = minAbsoluteSumDiff(nums1, nums2);System.out.println(res);}sc.close();}public static int minAbsoluteSumDiff(int[] nums1, int[] nums2) {final int MOD = 1000000007;int n = nums1.length;int[] sorted = nums1.clone();Arrays.sort(sorted);long sum = 0, max = 0;for (int i = 0; i < n; i++) {int a = nums1[i], b = nums2[i];if (a == b) continue;int diff = Math.abs(a - b);sum += diff;int left = 0, right = n - 1;while (left < right) {int mid = left + right + 1 >> 1;if (sorted[mid] <= b) left = mid;else right = mid - 1;}//寻找最接近b的元素,当前位置和下一个位置都检查一下,差值越小,说明越接近int newDiff = Math.abs(sorted[right] - b);if (right + 1 < n) newDiff = Math.min(newDiff, Math.abs(sorted[right + 1] - b));// 使用diff-newDiff,得到的是最大可削减的差值if (newDiff < diff) max = Math.max(max, diff - newDiff);}return (int) ((sum - max) % MOD);}
}

复杂度分析:

  • 时间复杂度:对 sorted 进行拷贝并排序的复杂度为O(nlogn);遍历处理数组时会一边统计,一边尝试二分,找最合适的替换数值,复杂度为 O(nlogn)。整体复杂度为 O(nlogn)。
  • 空间复杂度:使用 sorted 数组需要 O(n) 的空间复杂度,同时排序过程中会使用 O(logn) 的空间复杂度;整体复杂度为 O(n+logn)。

【Leetcode】1818.绝对差值和相关推荐

  1. leetcode 1818. 绝对差值和

    给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i ...

  2. LeetCode 1818. 绝对差值和(二分查找)

    文章目录 1. 题目 2. 解题 前三题,拼手速.最后一题暴力超时. 1. 题目 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差 ...

  3. 【LeetCode】1818. 绝对差值和

    题目 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= ...

  4. 力扣—1818.绝对差值和

    题目: 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 < ...

  5. 力扣 1818. 绝对差值和 数学 二分

    https://leetcode-cn.com/problems/minimum-absolute-sum-difference/ 思路:首先计算sum=∑i=0n∣ai−bi∣sum=\sum_{i ...

  6. leetcode 1818 绝对值,排序,二分法,最大值

    1818. 绝对差值和 难度中等130收藏分享切换为英文接收动态反馈 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为 ...

  7. LeetCode 910. 最小差值 II(贪心)

    1. 题目 给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B ...

  8. LeetCode 908. 最小差值 I

    1. 题目 给定一个整数数组 A,对于每个整数 A[i],我们可以选择任意 x 满足 -K <= x <= K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 ...

  9. sql 差值_SQL_LeetCode的连续性题目

    本篇分享一道来自于leetcode中文版第180题,关于SQL处理连续性的题目. 原题目:编写一个 SQL 查询,查找所有至少连续出现三次的数字. 数据表Logs如下: ID Num 1 1 2 1 ...

  10. 21-7-14 绝对差值和

    绝对差值和 难度[中等] 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i ...

最新文章

  1. jekyll 博客对搜索引擎的SEO提升方法--head中的meta标签和Jekyll SEO Tag
  2. 实验一:SQL server 2005高可用性之----日志传送
  3. 计算机论文学术不端,吉林大学计算机科学与技术学院 博士、硕士学位论文反学术不端行为暂行规定...
  4. 增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)
  5. python 如果没有该key值置为空_在python字典中用“None”替换空值
  6. logback.xml 常用配置详解
  7. 【转载】SQL update select结合语句详解及应用
  8. Mybatis面试题-日更
  9. Elasticsearch】 es Match Query
  10. 【SpringCloud】服务降级 Hystrix DashBoard
  11. WINHEX Scripts
  12. zoj 1100 - Mondriaan#39;s Dream
  13. 毕业设计/酒店管理系统
  14. 当浏览器默认禁用第三方cookie
  15. 算法实现: 在二叉树中找到两个节点的最近公共祖先
  16. SAS,软件使用中reg报错/gplot错误的解决方法。
  17. 【echarts应用】---pie饼图篇
  18. 大数据知识框架体系总结梳理
  19. gps有几个轨道面_GPS卫星定位原理详解
  20. 《自控力》总结_完结

热门文章

  1. 微信小程序分享给朋友和分享到朋友圈
  2. PS案例教程:photoshop路径运算和路径组合操作
  3. 如何通过CRM系统进行线索管理?
  4. OpenCV之IplImage详解
  5. python步态识别算法_步态识别
  6. 移动web前端开发注意事项
  7. C++ function
  8. Android TimePicker
  9. Log4j配置详解,太详细了。
  10. NAS网络文件服务器搭建流程