leetcode刷题-945-使数组唯一的最小增量

问题描述

给定整数数组 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 字典存储元素及元素重复情况,重复的逐个进行计算

A_len: A数组长度,用于遍历

A_dic: 存储数组元素以及元素出现次数

repeates: 存储有重复的元素

repeate_done: 以完成递增操作的元素以及递增数值

move_sum: 递增操作总次数

将数组使用数据类型为字典的A_dic存储,数组元素对应key值,元素数量对应value值

遍历A_dic中出现次数大于1的元素,将其放入到repeates中

遍历repeates数组,开始进行递增操作,先检查是否已经进行过相同元素的操作,若有,则从上次相同元素的递增次数开始探测,若没有,则从该元素的下一位开始探测,若有空位,则move_sum加上探测成功的递增次数,若没有,继续进行下一位的探测,直至找到空位为止

时间复杂度为O(n^2)

def min_increament_for_unique(A):
    """
    hash存储,找相邻的空位置相加
    """
    A_len = len(A)
    A_dic = {}
    repeates = []
    repeate_done = {}
    move_sum = 0

    for i in range(A_len):
        if A[i] in A_dic:
            A_dic[A[i]] += 1
            repeates.append(A[i])
        else:
            A_dic[A[i]] = 1

    for x in repeates:
        done_flag = False
        
        if x in repeate_done:
            current_move_count = repeate_done[x]+1
        else:
            current_move_count = 1
        
        while not done_flag:
            if (x+current_move_count) not in A_dic:
                A_dic[x+current_move_count] = 1
                repeate_done[x] = current_move_count
                move_sum += current_move_count
                done_flag = True
            else:
                current_move_count += 1
                move_sum += 1

    return move_sum

猜你喜欢

转载自www.cnblogs.com/liuheblog/p/12296372.html