NO.945 使数组唯一的最小增量 中等
思路一:排序
非递减排序,然后顺序遍历同时记录出现过的最大值curMax。
如果A[i]大于curMax因为是排序过的数组则A[i]是[0,i]区间内唯一的不需要move;如果A[i]小于等于curMax则需要move增加至大于curMax才能确保A[i]在[0,i]区间内是唯一的。
1 | public int minIncrementForUnique(int[] A) { |
时间复杂度:O(nlogn) 排序的时间。
思路二:计数法
有点像计数排序的感觉。计数数组大小为40000*2防止最坏情况40000个39999。
先统计所有数出现的个数。
然后遍历计数数组,如果A[i]个数大于1则将多出来的元素各进行一次move保证A[i]唯一,并将进行move的多余元素个数计入counter[A[i]+1]。
1 | public int minIncrementForUnique(int[] A) { |
时间复杂度:O(n+k) n数组长度,k范围,本题可以看做范围是个常数,复杂度O(n)。
本人菜鸟,有错误请告知,感激不尽!
更多题解和源码:github