LeetCode945-使数组唯一的最小增量

问题:使数组唯一的最小增量

给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1

返回使 A 中的每个值都是唯一的最少操作次数。

示例 1:

输入:[1,2,2]
输出:1
解释:经过一次 move 操作,数组将变为 [1, 2, 3]。

示例 2:

输入:[3,2,1,2,1,7]
输出:6
解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。

提示:

  1. 0 <= A.length <= 40000
  2. 0 <= A[i] < 40000

链接:https://leetcode-cn.com/contest/weekly-contest-112/problems/minimum-increment-to-make-array-unique/

分析:

1.每次move会将一个数字值加一

2.最终每个数字都不一样

3.最终结果应该是唯一的

4.增加方式不唯一,但是等价,比如从1 4 变为4 5,可以是1+4,也可以是1+3,4+1

5.操作次数其实就是最终数列和减去初始数列和

那么将原序列排序,要求递增,且差值中至少1,如果本身值就比前一个大于1,则保持,否则增加为前一个数字值+1,统计累计加值即为最终结果。

AC Code:

 

 1 class Solution {
 2 public:
 3 int minIncrementForUnique(vector<int>& A) {
 4         int ret = 0;
 5         if (A.size() < 2)
 6         {
 7             return 0;
 8         }
 9         sort(A.begin(), A.end());
10         int pre = A[0];
11         for (int i = 1; i < A.size(); i++)
12         {
13             if (A[i] <= pre)
14             {
15                 ret += (pre + 1 - A[i]);
16                 pre += 1;
17             }
18             else
19             {
20                 pre = A[i];
21             }
22         }
23 
24         return ret;
25     }
26 };

 

其他:

第一code:

 1 typedef long long ll;
 2 typedef vector<int> VI;
 3 typedef pair<int,int> PII;
 4 
 5 #define REP(i,s,t) for(int i=(s);i<(t);i++)
 6 #define FILL(x,v) memset(x,v,sizeof(x))
 7 
 8 const int INF = (int)1E9;
 9 #define MAXN 100005
10 
11 class Solution {
12 public:
13   int minIncrementForUnique(vector<int>& A) {
14     if (A.size() == 0) return 0;
15     sort(A.begin(), A.end());
16     int last = A[0];
17     int ans = 0;
18     REP(i,1,A.size()) {
19       if (A[i] <= last) {
20         ans += last + 1 - A[i];
21         last++;
22       } else {
23         last = A[i];
24       }
25     }
26     return ans;
27   }
28 };

 

posted @ 2018-11-25 15:53  youdias  阅读(686)  评论(0)    收藏  举报