使数组唯一的最小增量-解决了算法却倒在了算法性能

本文探讨了一道算法题目——使数组元素唯一化的最小增量问题。作者通过将问题转化为实物理解,阐述了解决方案,并分享了从重复遍历到排序优化的教训,强调了在大数据集下算法性能的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    其实这个的出错,还是在思考的不够扎实导致的,往往出现算法性能的地方,都是需要算法和数据结构的,这一点就是要在读题和推敲题目的过程中建立的,比如【这个使数组唯一的最小增量】的题目。

    我一开始疑问的地方是,怎么才算最小增量?怎么才不算最小增量?我就把它转化成了实物进行理解。就是在下面的4摞

 

就是往这4摞里面,塞最少的方块数,让他们不存在相同高度的摞。

所以我考虑一次塞入一个到相同高度的摞里面的其中一个,从而使他们不相同。后来我反复想发现,你只要从小的开始往大的找,遇到没有正好高一个台阶的,就给它加一个,最后的结果就是最小的,因为对于整体而言我们就是构建出最恰好逼近的每次只高出一个的台阶数。

这句话好好想想也能够理解。

 

可是我在之后犯了一个错误。我大量使用了重复遍历的方法,而没有先给他们排序,采取挨个的往前推进的办法。我的大量使用重复遍历的思路,在数组的元素量比较大的时候很吃亏,所以最后通过了几乎所有用例,却卡在了最后一个用大量数据测试性能上。

认识到一个问题,当数组的量比较大的时候,一定要采用先进行排序的思路,这个恰恰就是契合了索引查找的思想。当然这里使用排序是因为要解决这个问题的思路本身必须要这样,而不是采用排序的方法提高性能。

下面是用python写的:

class Solution {
public:
     int minIncrementForUnique(vector<int>& A) {
     if(A.size() == 0)
        return 0;
     int sum = 0;          //计数
     sort(A.begin(),A.end());    //排序
     for(int i = 1; i<A.size();i++)
     {
         while(A[i] <= A[i-1])  //直到后一个刚好大于前一个,保证最小增量
         {
             A[i]++;   
             sum++;
         }
     }
    return sum;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值