首页 > 其他分享 >6360.等值距离和-340

6360.等值距离和-340

时间:2023-04-09 20:45:48浏览次数:56  
标签:arr 等值 nums int prefix vector 340 ans 6360

等值距离和

给你一个下标从 0 开始的整数数组 nums 。现有一个长度等于 nums.length 的数组 arr 。对于满足 nums[j] == nums[i] 且 j != i 的所有 j ,arr[i] 等于所有 |i - j| 之和。如果不存在这样的 j ,则令 arr[i] 等于 0 。

返回数组 arr 。

示例 1:

输入:nums = [1,3,1,1,2]
输出:[5,0,3,4,0]
解释:
i = 0 ,nums[0] == nums[2] 且 nums[0] == nums[3] 。因此,arr[0] = |0 - 2| + |0 - 3| = 5 。
i = 1 ,arr[1] = 0 因为不存在值等于 3 的其他下标。
i = 2 ,nums[2] == nums[0] 且 nums[2] == nums[3] 。因此,arr[2] = |2 - 0| + |2 - 3| = 3 。
i = 3 ,nums[3] == nums[0] 且 nums[3] == nums[2] 。因此,arr[3] = |3 - 0| + |3 - 2| = 4 。
i = 4 ,arr[4] = 0 因为不存在值等于 2 的其他下标。
示例 2:

输入:nums = [0,5,3]
输出:[0,0,0]
解释:因为 nums 中的元素互不相同,对于所有 i ,都有 arr[i] = 0 。

提示:

\(1 <= nums.length <= 10^5\)
\(0 <= nums[i] <= 10^9\)
通过次数3,062提交次数10,354

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-distances
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路1:哈希表

首先自然的想法是使用哈希表记录每一个元素的位置,再遍历哈希表计算每一个元素和相等位置的元素的差值。超时。考虑最极端的情况,就是数组中的元素全部相同的情况下,通过遍历的方式计算相同元素的位置差值的和时间复杂度也是O(n^2)的。

code

class Solution {
public:
    //全是相同的数。。。。
    //10 ^ 5 * 10 ^ 5
    //哈希表实际上就是两次遍历啊
    //两次遍历的原因:计算a时abs(a,b)计算b时abs(a,b)
    
    vector<long long> distance(vector<int>& nums) {
        
        unordered_map<int,deque<int>> position;
        
        for(int i = 0;i < nums.size();i ++)
        {
            position[nums[i]].push_back(i);
        }
        
        int n = nums.size();
        vector<long long int> ans(n,0);
        
        long long int tmp = 0;
        for(int i = 0;i < nums.size();i ++)
        {
            
            for(int j = 1;j < position[nums[i]].size();j++)
            {
                tmp = abs(i - position[nums[i]][j]);
                ans[i] += tmp;
                ans[position[nums[i]][j]] += tmp;
            }
            position[nums[i]].pop_front();
            
        }
        
        return ans;
    }
};

解题思路2:前缀和

问题的关键是,对于哈希表中相同元素位置的有序数组vector,如何在O(n)的时间复杂度时间内计算每一个元素和其余元素之间差值的绝对值之和(当时还是急躁了,没有认真的分清楚一个个的子问题,想到了前缀和但是没有认真思考怎么做,功利心太重了,老是想着提高排名,还是要自然一点,做出来就行)。由于vector记录的是同一个元素出现的位置也就是有序的,那么如何计算vector中的一个元素nums和其余元素之间的差值呢。首先计算全部的前缀和,实际上可以分为两个部分进行处理:

  1. 一个是小于nums[i]的,结果是i * nums[i] - prefix[i]
  2. 一个是大于nums[i]的,结果是prefix[nums.size() -1] - prefix[i] - nums[i] * (nums.size() -1)
  3. nums[i]和其余元素之间的差值就是两个部分的和

顺便学习了一个新得语法:1LL,乘上一个1LL可以将int类型转换为 long long int 类型并且将计算结果保存在long long int类型变量中。

code

class Solution {
public:

    void get_ans(vector<int> & p,vector<long long int> & ans)
    {
        int len = p.size();
        vector<long long int> prefix(len,0);
        prefix[0] = p[0];

        for(int i = 1;i < len;i ++) prefix[i] = prefix[i-1] + p[i];

        long long int l_sum = 0,r_sum = 0;

        for(int i = 0;i < len;i ++)
        {
            l_sum =  1LL * (i + 1) * p[i] - prefix[i];
            r_sum = prefix[len - 1] - prefix[i] - 1LL * p[i] * (len - i - 1);
            ans[p[i]] = l_sum + r_sum;         
        }
    }
    vector<long long> distance(vector<int>& nums) {

        int n = nums.size();

        unordered_map<int,vector<int>> position;

        for(int i = 0;i < nums.size();i ++)
            position[nums[i]].push_back(i);

        vector<long long int> ans(n,0);

        for(auto p : position)
        {
            get_ans(p.second,ans);
        }   

        return ans;
    }
};

标签:arr,等值,nums,int,prefix,vector,340,ans,6360
From: https://www.cnblogs.com/huangxk23/p/17301002.html

相关文章

  • CH340串口问题
    ch340的串口还是要慎用啊,有些盗版的波特率上去了会出现乱码的问题,下面是我用的两个ch340的串口当波特率设置到了1500000的时候,左边的这个ch340就会一直乱码,右边的是正常的,需要注意,一开始还不信,后面用逻辑分析仪抓了一下数据,才确认是ch340的问题......
  • [loj3408]lancllords
    考虑归并排序,问题即如何合并两个序列\(A,B\)不妨假设\(|A|>|B|\),将\(A\)按下标奇偶性划分为\(A_{0}\)和\(A_{1}\)将\(A_{0}\)与\(B\)归并,得到序列\(C\)对于\(A_{1}\)中的元素,仅需与(\(C\)中)\(A_{0}\)中相邻两数间的\(B\)中元素比较比较次数为\(|B|\),用莫队实现,操作次数为......
  • ISYS3401 IT Evaluation
    ISYS3401ISYS3401ITEvaluation(2023)IndividualAssignment1(30%)ThisITEvaluationassignmentfollowsa3-phaseassessmentplanintroducedinlecture5.The......
  • AO3401-ASEMI低压P沟道MOS管AO3401
    编辑:llAO3401-ASEMI低压P沟道MOS管AO3401型号:AO3401品牌:ASEMI封装:SOT-23最大漏源电流:-4.2A漏源击穿电压:-30VRDS(ON)Max:0.05Ω引脚数量:3芯片个数:沟道类型:P沟道MOS管......
  • AO3401-ASEMI低压P沟道MOS管AO3401
    编辑:llAO3401-ASEMI低压P沟道MOS管AO3401型号:AO3401品牌:ASEMI封装:SOT-23最大漏源电流:-4.2A漏源击穿电压:-30VRDS(ON)Max:0.05Ω引脚数量:3芯片个数:沟道类型:P沟道MOS管、低压MOS管......
  • mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题
    一、事故还原我们仍然使用学生信息表,但是我们只需要保留两个字段即可:CREATETABLE`student_info`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`name......
  • [CCS12.1][CC2340] 环境搭建
    环境搭建​​一、CCS安装​​​​二、打补丁包​​​​三、环境修改​​一、CCS安装​​CCS12.0安装并设置中文​​​​CCS12.1.0.00007下载​​注:cc2340只能使用CCS1......
  • yolov5 移植到海思3403踩坑记
    1.忠告1.昇腾是昇腾,海思是海思!!尽管兄弟俩的解决方案相似度百分之九十五,但是能不能成功就看那百分之五,所以忘掉昇腾的一切,从海思文档一点点做起。2.文档很重要,文档内容......
  • ASEMI低压MOS管AO3401封装,AO3401图片
    编辑-ZASEMI低压MOS管AO3401参数:型号:AO3401封装:SOT-23漏极-源极电压(VDS):30V栅源电压(VGS):±12V连续漏电流(I):4.2A脉冲漏极电流(IDM):30A功耗(PD):1.4W接头和储存温度范围(TJ,TSTG):-55to......
  • ASEMI低压MOS管AO3401封装,AO3401图片
    编辑-ZASEMI低压MOS管AO3401参数:型号:AO3401封装:SOT-23漏极-源极电压(VDS):30V栅源电压(VGS):±12V连续漏电流(I):4.2A脉冲漏极电流(IDM):30A功耗(PD):1.4W接头和储存温度范围(TJ,......