其实这个的出错,还是在思考的不够扎实导致的,往往出现算法性能的地方,都是需要算法和数据结构的,这一点就是要在读题和推敲题目的过程中建立的,比如【这个使数组唯一的最小增量】的题目。
我一开始疑问的地方是,怎么才算最小增量?怎么才不算最小增量?我就把它转化成了实物进行理解。就是在下面的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;
}
};