当前位置: 首页 > article >正文

绝对差值的和

问题分析:

  1. 取模操作的位置不正确

    • 你在计算 result - max_ 之前没有正确处理大数取模,这可能导致数值溢出。
  2. 最大差值减少量的计算

    • 算法中的内部循环效率较低,可以优化。

优化后的代码:

我们可以参考官方题解,优化算法并确保取模操作的正确性。

class Solution {
public:
    int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
        int length_ = nums1.size();
        long result = 0;
        long max_ = 0;
        
        // 先计算初始的绝对差值和
        for (int i = 0; i < length_; i++) {
            result += abs(nums1[i] - nums2[i]);
        }
        
        // 找到可以替换的最大差值减少量
        vector<int> sorted_nums1 = nums1;
        sort(sorted_nums1.begin(), sorted_nums1.end());
        
        for (int i = 0; i < length_; i++) {
            int original_diff = abs(nums1[i] - nums2[i]);
            auto it = lower_bound(sorted_nums1.begin(), sorted_nums1.end(), nums2[i]);
            
            int new_diff = original_diff;
            if (it != sorted_nums1.end()) {
                new_diff = min(new_diff, abs(*it - nums2[i]));
            }
            if (it != sorted_nums1.begin()) {
                new_diff = min(new_diff, abs(*prev(it) - nums2[i]));
            }
            
            max_ = max(max_, original_diff - new_diff);
        }
        
        return (int)((result - max_) % 1000000007);
    }
};

详细解释优化后的代码:

  1. 计算初始绝对差值和

    for (int i = 0; i < length_; i++) {
        result += abs(nums1[i] - nums2[i]);
    }
    
    • 首先计算 nums1nums2 每个对应元素的绝对差值的和。
  2. nums1 进行排序

    vector<int> sorted_nums1 = nums1;
    sort(sorted_nums1.begin(), sorted_nums1.end());
    
    • 为了更高效地找到可以替换的元素,我们对 nums1 进行排序。
  3. 遍历每个元素并尝试找到最佳替换

    for (int i = 0; i < length_; i++) {
        int original_diff = abs(nums1[i] - nums2[i]);
        auto it = lower_bound(sorted_nums1.begin(), sorted_nums1.end(), nums2[i]);
        
        int new_diff = original_diff;
        if (it != sorted_nums1.end()) {
            new_diff = min(new_diff, abs(*it - nums2[i]));
        }
        if (it != sorted_nums1.begin()) {
            new_diff = min(new_diff, abs(*prev(it) - nums2[i]));
        }
        
        max_ = max(max_, original_diff - new_diff);
    }
    
    • 对于每个 nums2[i],使用二分查找在排序后的 nums1 中找到最接近的元素,并计算替换后的新差值。
    • 更新最大差值减少量 max_
  4. 计算最终结果并取模

    return (int)((result - max_) %
    

http://www.kler.cn/news/363843.html

相关文章:

  • “声音”音源设置和音效播放
  • MoeCTF 2024 ---Misc方向WP
  • 高薪、高含金量、高性价比的“三高”证书——PMP证书
  • c++实现跳表
  • Vue项目的创建
  • FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持
  • 力扣 —— 分发糖果
  • Vue中app.config.globalPropertiesVue.prototype和getCurrentInstance的使用
  • 机器视觉相机自动对焦算法
  • spark on kubernetes运行测试
  • Linux之例行性工作
  • 管道与共享内存
  • 【Go语言】语法基础之变量、数据类型详解
  • perl双引号内字符串的反斜线转义
  • 【Linux系统】Linux系统习题整理
  • zsh: command not found: nvm 问题(Mac)
  • 得物iOS函数调用栈及符号化调优实践|得物技术
  • 【前端布局 如何适配不同分辨率 vue2】
  • 12、论文阅读:利用生成对抗网络实现无监督深度图像增强
  • 【Java】多线程-线程创建的两种方式【主线学习笔记】
  • 在vue中key的原理是什么,有什么作用
  • 《Vue.js 组件开发秘籍:从基础到高级》
  • CTFHUB技能树之文件上传——无验证
  • sql-labs靶场第十六关测试报告
  • 一款精美的导航引导页html源码
  • STM32 从0开始系统学习 1