zoukankan      html  css  js  c++  java
  • LeetCode-使数组唯一的最小增量

    题目描述:

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

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

    示例:

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

    解题思路:

    这道题的思路有两种:①排序。②计数。 这里我用的是排序,有兴趣可以看一下官方题解(虽然我没看懂,怪我太LJ):使数组唯一的最小增量题解链接

    思路:首先就是把传入的数组A进行排序(方便之后的操作)。我们将从下标1开始遍历,当前元素为A[1],因为A是已经排过序的,所以前面的A[0]要么小于A[1],要么和A[1]相同,也就是说 A[1] - A[0] >= 0  (这里仅讨论下标为1的情况,后边先不要着急)。由题意我们可以知道,要想获取最小操作数,后面的元素一定要比前面的元素大1(原本就比前面元素大的除外)。即 A[1] 如果和A[0] 相同时,A[1] 加 1,A[1] > A[0] 时,A[1]保持不变,继续遍历下一个元素A[2]。。直到遍历到最后一个元素。

    假设 A =[3,2,1,2,1,7] 。排序后 A = [1,1,2,2,3,7] ,A[1] - A[0] = 0 ,此时 A[1] + 1 ,变为 A = [1,2,2,2,3,7], A[2] - A[1] = 0 ,A[2] + 1,此时A=[1,2,3,2,3,7] ....以此类推。

    代码:

    import collections
    from typing import List


    def minIncrementForUnique(A: List[int]) -> int:
    A.sort()
    res = 0 # 记录操作次数
    for i in range(len(A))[1:]: # 从下标1开始遍历
    x = A[i]-A[i-1] # 后面一个元素 - 前面一个元素的差值,如果小于或等于 0 ,操作数和此元素值同时加上该差值的绝对值+1,并返回给操作数和此元素
    if x <= 0:
    A[i] += abs(x) + 1
    res += abs(x) + 1
    else:
    continue
    return res

    minIncrementForUnique([3,2,1,2,1,7])
  • 相关阅读:
    【题解】Codeforces Round #600(Div.2)
    【题解】CF 1073 G. Another LCP
    【题解】CF 1129C. Morse Code
    【题解】CF 1200E. Compress Words
    Cpp Chapter 8: Adventures in Functions Part4
    Cpp Chapter 8: Adventures in Functions Part3
    Python Chapter 9: 使用Tkinter进行GUI程序设计 Exercise
    Python Chapter 9: 使用Tkinter进行GUI程序设计 Part 4
    Python Chapter 9: 使用Tkinter进行GUI程序设计 Part 3
    Python Chapter 9: 使用Tkinter进行GUI程序设计 Part 2
  • 原文地址:https://www.cnblogs.com/RiverMap/p/12548435.html
Copyright © 2011-2022 走看看